UVa202

来源:互联网 发布:近视蓝光眼镜 知乎 编辑:程序博客网 时间:2024/05/16 19:33

写的比较暴力,把余数乘10的存储和余数的存储分开了,导致逻辑有些混乱而不得不考虑多种特殊情况(这样写主要是循环节以0开始比较麻烦,如50/99等)

另外注意输出小数位后50而不是循环节的前50位。

#include<stdio.h>#include<string.h>#define INFINITE 3005const 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;}

0 0
原创粉丝点击