UVA - 202 Repeating Decimals

来源:互联网 发布:热云数据 编辑:程序博客网 时间:2024/04/26 01:38

题目大意:求循环小数,循环节用()括住,并输出循环节长度。

解题思路:a/b 时,b 不变,a 取余数循环除 b,当 a 出现相同数值时,小数开始循环,所以有一个数组用来判断被除数是否出现过。模拟除法过程,储存商,当余数重复,停止运算。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctype.h>using namespace std;int used[3000000];int ans[3000000];int loop[3000000];int main() {    int a, b;    while(scanf("%d%d", &a, &b) != EOF) {        memset (used, 1, sizeof(used));        printf("%d/%d = %d.", a, b, a/b);        a %= b;        int cnt = 0;        while (used[a]) {            cnt++;            used[a] = 0;            ans[a] = cnt;            a *= 10;            loop[cnt] = a / b;            a %= b;        }        for (int i = 1; i < ans[a]; i++)            printf("%d", loop[i]);        printf("(");        for (int i = ans[a], j = 1; i <= cnt && j <= 50; i++, j++) {            printf("%d", loop[i]);            if (j == 50 && i < cnt) printf("...");        }        printf(")\n   %d = number of digits in repeating cycle\n\n", cnt-ans[a]+1);    }    return 0;}
0 0