1.题目描述:点击打开链接
2.解题思路:先计算小数点后到m位,m应尽可能大;由于周期不会超过分母,故一个个的枚举周期即可,注意周期是否大于50时要单独处理
3.代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#define max 7000
int arr[max];
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int a, b;
while (scanf("%d %d", &a, &b) == 2)
{
memset(arr, 0, sizeof(arr));
int x = floor((double)a / b);
printf("%d/%d = %d.", a, b, x);
int m = a%b;
int i, period = 0;
for (int k = 0; k < 7000; k++)//计算小数点后7000位
{
m *= 10;
arr[k] = m / b;
m = m%b;
}
for (i = 0;; i++)
{
int ok1 = 1, ok2, l;
for (l = 1; l <= b; l++)//枚举周期
{
ok2 = 1;
int len = 7000 - i;
for (int j = 0; j < len; j++)
if (arr[j + i] != arr[j % l + i])//判断是不是周期
{
ok2 = 0;
break;
}
if (ok2)
{
period = l; break;
}
}
if (!period)
ok1 = 0;
if (ok1)
{
printf("(");
if (period <= 50)
for (int j = i; j < i + period; j++)
printf("%d", arr[j]);
else
{
for (int j = i; j < i + 50; j++)
printf("%d", arr[j]);
printf("...");
}
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n", period);
break;
}
else
printf("%d", arr[i]);
}
}
return 0;
}