//算法总结:
//对于a / b
//它的余数最多只有b种(即从0到b-1)
//所以当被除数c在前面出现过时,则表示出现了循环节
//循环节即为上一个c的位置到当前c的位置中间的部分
这道题总体不算难,并且目前网上已经有很多题解啦,但我还是受到巧妙数学算法和数学规律的震撼,所以就发表这篇博文啦。
同时自己也要多学习学习标记数组的用法。
#include <stdio.h>
#include <string.h>
#define MAXN 10005
int 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]);
}
}