- WinCE Security...
 - xdebug配置说明
 - VC++ 获取文件的创建、修...
 - ASP进度条
 - 简单代理服务器C代码实现(S...
 - 程序设计竞赛试题选(02)
 - 如何在ASP程序中打印Acc...
 - UTF-8和16进制区间
 - ASP实用技巧:强制刷新和判...
 - 运行中程序删除自己的方法
 - asp提高首页性能的一个技巧
 - [J2EE]J2EE 应用服务器技术
 - VB变量命名规范
 - C语言常见错误小结
 - (摘自网络)如何在IIS中调...
 
程序设计竞赛试题选(01)
写出一个程序,接受一个以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();           /*打印结果*/
}