C3-UVa202-Repeating Decimals

平台:

UVa Online Judge

題號:

202 - Repeating Decimals

題目連結:

q

題目說明:

输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例子如下图。

C3-UVa202-Repeating Decimals_第1张图片

範例輸入:

76 25
5 43
1 397

範例輸出:

76/25 = 3.04(0)
1 = number of digits in repeating cycle
5/43 = 0.(116279069767441860465)
21 = number of digits in repeating cycle
1/397 = 0.(00251889168765743073047858942065491183879093198992...)
99 = number of digits in repeating cycle

解題方法:

题目有个小问题,最后一行不输出回车,会格式错误。

判断小数是否循环,只需查看余数是否出现过。

程式碼:

 1 #include 
 2 #include 
 3 
 4 const int MAXN = 3010;
 5 const int N = 50;
 6 const char* msg = " = number of digits in repeating cycle\n";
 7 
 8 int remainder[MAXN] = { 0 };
 9 int quotient[MAXN] = { 0 };
10 
11 //余数是否出现过
12 bool isContinue(int r, int& index) {
13 
14     int i = 0;
15     while (remainder[i]) {
16         if (r == remainder[i]) {
17             index = i;
18             return false;
19         }
20         i++;
21     }
22     remainder[i] = r;
23     if (r == 0) {
24         index = i;
25         return false;
26     }
27     return true;
28 }
29 
30 void signStep(int& a, const int b, int& cnt) {
31     a *= 10;
32     //remainder[cnt] = a % b;
33     int t = a / b;
34     if (t) {
35         a %= b;
36     }
37     if (cnt < N) {
38         quotient[cnt] = t;
39     }
40     cnt++;
41 }
42 
43 void printDecimal(int first, int cnt) {
44     bool flag = false;
45     for (int i = 0; i < first; i++) {
46         printf("%d", quotient[i]);
47     }
48     printf("(");
49     if (cnt + first > N) {
50         flag = true;
51         cnt = N - first;
52     }
53     for (int i = first; i < first + cnt; i++) {
54         printf("%d", quotient[i]);
55     }
56     if (flag) {
57         printf("...");
58     }
59     printf(")\n");
60 }
61 
62 int main() {
63     //freopen("in.txt", "r", stdin);
64     //freopen("out.txt", "w", stdout);
65     int a = 1, b = 1;
66     //bool flag = false;
67     while (scanf("%d%d", &a, &b) == 2) {
68         //if (flag) {
69         //    printf("\n");
70         //}
71         //else {
72         //    flag = true;
73         //}
74         printf("%d/%d = %d.", a, b, a / b);
75         a %= b;
76 
77         memset(remainder, 0, sizeof(remainder));
78         memset(quotient, 0, sizeof(quotient));
79         int cnt = 0;
80         int first = 0;
81 
82         //循环计算
83         while (isContinue(a, first)) {
84             signStep(a, b, cnt);
85         }
86         //计算循环小数的位数
87         cnt -= first;
88         if (cnt == 0) {
89             cnt++;
90         }
91         printDecimal(first, cnt);
92         printf("   %d%s\n", cnt, msg);
93     }
94     return 0;
95 }

 

你可能感兴趣的:(C3-UVa202-Repeating Decimals)