平台:
UVa Online Judge
題號:
202 - Repeating Decimals
題目連結:
q
題目說明:
输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例子如下图。
範例輸入:
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 <cstdio> 2 #include <cstring> 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 }
Happy Life Forever