//计算循环小数,并找出循环节以及循环节的长度,最后输出时若循环节大于50最后输出省略号。 //求循环小数,记录被除数,若被除数相同了则证明循环了。 //注意:即使是循环小数,但可能并不是从第一位小数开始循环 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int rm[1010]; int vis[1000010]; int rec[1000010]; int main() { int a,b; while(~scanf("%d%d",&a,&b)) { memset(vis,0,sizeof(vis)); memset(rec,0,sizeof(rec)); printf("%d/%d = %d",a,b,a/b); a=a%b; int k=1; //k为小数点后循环整数个数 while(!vis[a]&&a) { vis[a]=k; //记录被除数出现的位置 rec[k]=a; //记录被除数 a=a*10; //一直保持被除数记录为整数 rm[k++]=a/b; //记录小数点后的循环整数 a=a%b; } printf("."); for(int i=1;i<k&&i<=50;++i) { if(a&&a==rec[i]) printf("("); printf("%d",rm[i]); } if(!a) printf("(0"); if(k>50) printf("..."); printf(") "); printf(" %d = number of digits in repeating cycle ",a?(k-vis[a]):1); //注意打印空行 } return 0; }