1. 程式人生 > >(WA) 求改..UVa202 Repeating Decimals 迴圈小數 紫書習題3-8

(WA) 求改..UVa202 Repeating Decimals 迴圈小數 紫書習題3-8

程式碼:

//xi 3-8 Repeating Decimals.cpp
/*第0步,分子是5,分母是7(分母在整個除法中始終不變),5/7的商是0,代表這個除法的整數部分是0,,餘數是5,乘以10,得50作為第1步的分子;50/7的商為7,代表這個除法的第一位小數是7,餘數是1,乘以10,得10作為第2步的分子...可以發現每步的除法只跟分子有關,也就是當分子出現重複值,如上圖第1步和第7步的分子值都為50時,第7步後面的運算其實是在重複第1步至第6步間的運算。所以第1步至第7步就是一個迴圈節。*/ 
#include <cstdio>
using namespace std;

int A[2][3010
], p, q;//程式實現中,可以不用儲存餘數的值,只需儲存上 //圖中的分子和商,我定義了A[2][3010],用A[0] //[j]儲存第j步的分子, //A[1][j]儲存第j步的商。注意最後的數值由商可以直接構成 int myfind() //找i位之前是否有重複分子出現;有則返回週期len,否則返 //回-1. { for(p = 1; p < q; p++) { if(A[0][p] == A[0][q]) return
q - p; } return -1; } int main() { int kase, a, b, i, len; for(kase = 1; scanf("%d%d", &a, &b) == 2; kase++) { A[0][0] = a; A[1][0] = a/b; for(q = 1; ; q++) { A[0][q] = (A[0][q-1] - b*A[1][q-1])*10; //分子 //, 一直X10
//A[0] //[q] = 10*A[0][q-1] % A[1][q-1]; //不能這樣 //寫, 因為這樣寫可能分母為0 A[1][q] = A[0][q] / b; //商 len = myfind(); if(len > 0) break; } printf("%d/%d = %d.", a, b, A[1][0]); for(int i = 1; i < p; i++) printf("%d", A[1][i]); putchar('('); for(int i = p; i < q; i++) { if(i > 50) { printf("..."); break; } printf("%d", A[1][i]); } printf(")\n %d = number of digits in reperting cycle\n\n", len); } return 0; }

注意:其中分子是餘數X10, 為避免a/b為0, 不用%符號來取得餘數, 用A[0][q] = (A[0][q-1] - b*A[1][q-1])*10;