//模拟人脑计算有理数的循环节
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 10000;
int decimal[maxn];
struct node {
int a, b;
};
node mark[maxn];
int visited(int a, int b, int len);
int main() {
//freopen("Text.txt", "r", stdin);
int a, b;
while (scanf("%d %d", &a, &b)!=EOF) {
int i, j, x, cnt=1;
for (i = 0; i < maxn; i++) {//初始化
decimal[i] = -1;
mark[i].b = b;
}
decimal[0] = a / b;//计算整数部分
x = a%b * 10;
while (1) {
decimal[cnt] = x / b;
mark[cnt].a = x;
if (visited(x, b, cnt))break;
x = x%b * 10;
cnt++;
}
//for (i = 0; i <= cnt; i++)printf("%d", decimal[i]);
//cout << endl;
int begin = visited(mark[cnt].a, mark[cnt].b, cnt);
//printf("begin=%d\n", begin);
//for (i = 1; i <= cnt; i++) printf("a = %d,b = %d\n", mark[i].a, mark[i].b);
cnt--;
//输出部分
if (cnt > 50) {
printf("%d/%d = %d.", a, b, decimal[0]);
for (i = 1; i < begin; i++)printf("%d", decimal[i]);
printf("(");
for (i = begin; i <= 50; i++)printf("%d", decimal[i]);
printf("...)\n");
printf(" %d = number of digits in repeating cycle\n\n", cnt-begin+1);
}
else {
printf("%d/%d = %d.", a, b, decimal[0]);
for (i = 1; i < begin; i++)printf("%d", decimal[i]);
printf("(");
for (i = begin; i <= cnt; i++)printf("%d", decimal[i]);
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n", cnt-begin+1);
}
}
return 0;
}
int visited(int a, int b, int len) {//利用分子分母相同计算循环节的开始
for (int i = 1; i < len; i++) {
if (mark[i].a == a&&mark[i].b == b)
return i;
}
return 0;
}
题目链接:
https://vjudge.net/problem/UVA-202