首页 服务器 编程 必备知识 搜索引擎 圩日手册
站内搜索
最近浏览
推荐文章
热文排行

程序设计竞赛试题选(01)


1.分数变小数
    写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环 节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/46=.803(571428)
    用上面的分数和11/59来测试你的程序。
运行举例:
ENTER N,D:17
1/7=.(142857)
本题中,0<=N<=65535,0<=D<=65535,设运算结果小数点后最多保留100位。
(1)解题思路
    本题可以模仿手算除法的形式,重复地进行求商和余数的运算,直到余数为0或出现循环节为止。
(2)参考程序
Const Max=100;                        (小数点后最大位数)
Var Left,Digit:Array[0..Max]of Word;  (记录每次的余数和商)
    n,d:Word;                         
    q,Top:Word;                       (q为循环字节的位置)
Procedure Init;
Begin
    Write('ENTER N,D:');
    Readln(n,d);
End;
Procedure Cacl;               (计算)
Var i:Word;
Begin
    Digit[0]:=n Div d;
    Left[0]:=n Mod d;
    Top:=0;
    q:=0;                      (初始化商和余数)
    While Left[Top]<> 0 Do      (余数不为0则循环)
        Begin
            Inc(Top);
            Digit[Top]:=(Left[Top-1]*10)Div d;
            Left[Top]:=(Left[Top-1]*10)Mod d;
            For i:=0 To Top-1 Do
            If Left[Top]=Left[i] Then
                Begin
                    q:=i+1;
                    Exit;             (如果出现循环节则退出)
                End;
        End;
End;

Procedure Print;
Var i:Word;
Begin
    Write(n,'\',d,'=');
    If(Digit[0]<>0 Then Write(Digit[0]);
    If Top>0 Then Write('.');
    For(i:=1 To Top Do
        Begin
            If i=q Then Write('(');
            Write(Digit[i]);
        End;
    If q>0 Then Write(')');
    Writein;
End;
Begin
    Init;                {读入数据}        
    Cacl;                {计算}
    Print;;              {打印结果}
End.
(3)运行结果
ENTER N,D:11 59
11/59=.(1864406779661016949152542372881355932203389830508474576271)

附:改写后的C源程序如下:
#include<stdio.h>
#define Max 100           /*小数点后最大位数*/
int Left[Max];
int Digit[Max];              /*记录每次的余数和商*/
int n,d,q,Top;               /*q为循环字节的位置*/

void Init(void)
{
  printf("ENTER N,D:");
  scanf("%d %d",&n,&d);
}

void Cacl(void)       /*计算*/
{
  int i=0,j=1;
  Digit[0]=n/d;           /*求商*/
  Left[0]=n%d;            /*求余数*/
  Top=0;
  q=0;              /*初始化商和余数*/
  while(Left[Top]!=0&&j==1&&Top<100)
  {
    Top++;           /*取下一个数组元素*/
    Digit[Top]=(Left[Top-1]*10)/d;   /*求商*/
    Left[Top]=(int)(Left[Top-1]*10)%d; /*求余数*/

    for(i=0;i<Top-1;i++)
    {
      if(Left[Top]==Left[i])    /*如果出现循环节则退出*/
      {
        q=i+1;
        j=0;
        break;
      }

    }
  }
}

void Print(void)           /*输出计算结果*/
{
  int i;
  printf("n/d=  ");
  if(Digit[0]!=0) printf("%d",Digit[0]);
  if(Top>0) printf(".");
  for(i=1;i<=Top;i++)
  {
    if(i==q)  printf("(");
    printf("%d",Digit[i]);
  }
  if(q>0)  printf(")");
}

void main(void)
{
  Init();      /*读入数据*/
  Cacl();            /*计算*/
  Print();           /*打印结果*/
}

[wangjy17908]
添加时间:2007-10-07
版权所有(C)2005-2015