思路:竖式除法,如果在除的过程遇到出现相同的余数,则出现循环节
直接上代码
#include <stdio.h>
int IsIn(int a, int rem[], int n)
{
for(int i=1; i<n; i++)
{
if(a == rem[i]) return i;
}
return 0;
}
int main()
{//在除的过程中,只要遇到余数相同,一定就找到了循环节!
int T;
scanf("%d", &T);
while(T--)
{
int a, b, decimal[2000], Rem[2000] = {0}, rem, integer, start, end, cycle = 1;
scanf("%d %d", &a, &b);
Rem[1] = rem = a % b;
if(Rem[1] == 0) {printf(" %d/%d = %d.(0)\n", a, b, a/b); goto END;}
integer = a/b;
for(int i=2; ; i++)
{
rem *= 10;
decimal[i-1] = rem / b;
if(rem % b == 0) {end = i-1; cycle = 0; break;} //如果余数是0,就不是循环小数
rem = Rem[i] = rem % b;
start = IsIn(rem, Rem, i);
if(start) {end = i - 1; break;}
}
//一下仅仅是输出格式,不必关心
printf(" %d/%d = %d.", a, b, integer);
if(cycle)
{
for(int i=1; i<start; i++)
{
printf("%d", decimal[i]);
}
printf("(");
if(end - start + 1 <= 50)
{
for(int i=start; i<=end; i++)
{
printf("%d", decimal[i]);
}
}
else
{
for(int i=start; i< start+50; i++)
{
printf("%d", decimal[i]);
}
printf("...");
}
printf(")\n");
printf(" %d = number of digits in repeating cycle\n", end-start+1);
}
else
{
for(int i=1; i<=end; i++)
{
printf("%d", decimal[i]);
}
printf("(0)\n");
END:printf(" 1 = number of digits in repeating cycle\n");
}
}
return 0;
}