3018 - 分数化小数
写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数中有循环节的话,把循环节放在一对括号中。例如:
1/3=.33333333…写成0.(3)
41/333=0.123123123…写成0.(123)
用XXX.0表示整数
典型的转化例子:1/3=0.(3) 22/5=4.4 1/7=0.(142857) 2/2=1.0
3/8=0.375 45/56=0.803(571428)
Input
单独的一行包括被空格分开的N和D,1≤N,D≤100000
Output
输出一行,小数的表示方法上面已经说得很明白了。
Examples
Input
45 56
Output
0.803(571428)
Solution C++
#include<cstdio> #include<cmath> #include<climits> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<queue> using namespace std; int N,D; int Ans[101000]={0}; int flag[100000][2]={0}; int main() { //freopen("fracdec.in","r",stdin); //freopen("fracdec.out","w",stdout); memset(flag,-1,sizeof(flag)); scanf("%d%d",&N,&D); int n=N,d=D; int str=0,end=0; n=n%d; while(n && Ans[0]<100000) { Ans[++Ans[0]]=(n*10)/d; n=(n*10)%d; if(flag[n][0]==-1) { flag[n][1]=Ans[Ans[0]]; flag[n][0]=Ans[0]; } else { if(end==0) { if(flag[n][1]==Ans[Ans[0]]) { str=flag[n][0]; end=Ans[0]; } } } } int tot=0; int c=0; if(Ans[0]==100000) { printf("%d.",N/D); for(int h=1;h<str;++h) printf("%d",Ans[h]); printf("("); for(int h=str;h<end;++h) printf("%d",Ans[h]); printf(")"); return 0; } else { if(N%D==0) { printf("%d.0",N/D); } else { printf("%d.",N/D); for(int i=1;i<=Ans[0];++i) { printf("%d",Ans[i]); } } } //fclose(stdin); //fclose(stdout); return 0; }