//算法总结:
//对于a / b
//它的余数最多只有b种(即从0到b-1)
//所以当被除数c在前面出现过时,则表示出现了循环节
//循环节即为上一个c的位置到当前c的位置中间的部分
这道题总体不算难,并且目前网上已经有很多题解啦,但我还是受到巧妙数学算法和数学规律的震撼,所以就发表这篇博文啦。
同时自己也要多学习学习标记数组的用法。
#include <stdio.h>
#include <string.h>
#define MAXN 10005int ans[MAXN] , judge[MAXN] ;//judge数组用来记录每个被除数出现的位置int main ()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int first = 1;int a,b;while(scanf("%d %d",&a,&b)!=EOF){memset(judge,0,sizeof(judge));int i = 1,j;//i是被除数的位置变量printf("%d/%d = %d.",a,b,a/b);a %= b;while(!judge[a]){judge[a] = i;a *= 10;ans[i] = a / b;i++;a %= b;}for(j=1;j<judge[a];j++) printf("%d",ans[j]);printf("(");if(i-1<=50){for(j=judge[a];j<i;j++) printf("%d",ans[j]);}else{for(j=judge[a];j<=50;j++) printf("%d",ans[j]);printf("...");}printf(")\n");printf(" %d = number of digits in repeating cycle\n\n",i-judge[a]);}
}