题意:求出两数字相除的循环小数以及循环节的长度。可以通过判断余数是否相同来判断一个循环的结束。设定一个数组,数组的标号表示可能出现的余数,设置一个变量count,当序号所表示的余数出现时将count值附上去作为标记,也方便统计循环节的长度。
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define MAX 10000
int main()
{
int a, b, i, length, mark;//mark用来标记进入循环时的位置
char ans[MAX];
int list[MAX];//存储序号的数组
int count;
while(scanf("%d %d", &a, &b)!=EOF)
{
count = 1;
length = 1;
mark=-1;
memset(ans, 0, sizeof(ans));
memset(list, 0, sizeof(list));
i = a/b;
printf("%d/%d = %d.", a, b, i);
a = a%b;
while(a!=0)
{
if(list[a] == 0)
{
list[a]=count;
ans[count] = 10*a/b + '0';
count++;
a = 10*a%b;
continue;
}
else if(list[a]!=0)
{
length = count - list[a];
mark = list[a];
break;
}
}
for(int i=1; i<count && i<=50; i++)
{
if(i == mark)
printf("(");
printf("%c", ans[i]);
}
if(a==0)
printf("(0");
if(count>50)
printf("...");
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n", length);
}
return 0;
}