分数变小数 (2007年青岛市程序设计竞赛试题(小学组))
写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环节,要将其用括号括起来。例如:1/3=.33333…表示为.(3),又如41/333=.123123… 表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/56=0.803(571428)
输入(a5.in):一行,两个数n、d,中间用空格隔开,0<N<65535,0<D<65535。
输出(a5.out):一行,设运算结果小数点后最多保留100位。
样例:
输入:1 7
输出:1/7=.(142857)
没什么太简单的思路,就是模拟一下就好了,如果现在的余数在之前出现过,说明出现了循环节这时break 就好了,
我看网上其他代码大多数碰到121/12时都会出现错误(正确答案是10.08(3))
就写了这篇博客
#include<bits/stdc++.h> using namespace std; #define Max 100 int Left[Max]; int Digit[Max]; int n,d,q,Top; 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("%d/%d=",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(")"); } } int main(void) { scanf("%d%d",&n,&d); Cacl(); print(); return 0; }