题意
给定一个分数(任何有理数都可以表示成循环小数),请按照格式输出该分数的结果。
输出格式
将循环节用括号包裹起来,如果循环节长度超过50位就只输出前50位,剩下的用"…"代替。第二行前面有三个空格。
思路
自己随便算两个分数,就能发现规律:如果被除数出现重复,那么就出现了循环节!!
AC代码
//#define LOCAL
#include <stdio.h>
#include <string.h>
const int maxn = 100000 + 5;
int a, b;
int vis[maxn], res[maxn];
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
while(scanf("%d%d", &a, &b) == 2) {
memset(vis, -1, sizeof(vis));
int c = a % b, cnt = 0;
c *= 10;
while(vis[c] == -1) {
res[cnt] = c / b;
vis[c] = cnt++;
c %= b;
c *= 10;
}
// repeating cycle start-position
int sta_pos = vis[c];
printf("%d/%d = %d.", a, b, a/b);
for(int i = 0; i < sta_pos; i++) {
printf("%d", res[i]);
}
printf("(");
if(cnt - sta_pos <= 50) {
for(int i = sta_pos; i < cnt; i++) {
printf("%d", res[i]);
}
} else {
for(int i = sta_pos; i < sta_pos+50; i++) {
printf("%d", res[i]);
}
printf("...");
}
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n", cnt - sta_pos);
}
return 0;
}
如有不当之处欢迎指出!