写的比较暴力,把余数乘10的存储和余数的存储分开了,导致逻辑有些混乱而不得不考虑多种特殊情况(这样写主要是循环节以0开始比较麻烦,如50/99等)
另外注意输出小数位后50而不是循环节的前50位。
#include<stdio.h>
#include<string.h>
#define INFINITE 3005
const char*msg="number of digits in repeating cycle";
int cr[INFINITE];
int cq[INFINITE];
int main()
{
int m,n;
s:while(scanf("%d%d",&m,&n)==2&&n){
memset(cr,0,sizeof(cr)); memset(cq,0,sizeof(cq));
int q=m/n,r=m%n,count=1;
printf("%d/%d = %d.",m,n,q);
m=r;
cr[r]=1;
while(r){
m*=10;
while(m<n) { cq[count++]=0;
if(cr[m]){
if(cr[m]){
for(int i=1;i<=cr[m]-1;i++) printf("%d",cq[i]);
printf("(");
for(int i=cr[m];i<count;i++){
if(i==51){ printf("..."); break;
}
else printf("%d",cq[i]); }
printf(")\n %d = %s\n\n",count-cr[m],msg);
goto s;
}
}
else cr[m]=count;
m*=10; }
q=m/n; r=m%n; cq[count++]=q;
if(cr[r]){
for(int i=1;i<=cr[r]-1;i++) printf("%d",cq[i]);
printf("(");
for(int i=cr[r];i<count;i++){
if(i==51){ printf("..."); break;
}
else printf("%d",cq[i]); }
printf(")\n %d = %s\n\n",count-cr[r],msg);
goto s;
}
else{
cr[r]=count; m=r;
}
}
for(int i=1;i<count;i++){
if(i==51){ printf("..."); break; }
else printf("%d",cq[i]); }
printf("(0)\n 1 = %s\n\n",msg);
}
return 0;
}