題目連結:
題目大意:
一個無限循環小數(例如 0.999……、0.12333…… 等)可以藉由以下公式
化成一個分數(更多講解請參見
維基之說明)。其中 j 為循環節長度、k 為非循環節之長度。
輸入有多列(當遇到一列「-1」代表輸入結束),每列給定一非負整數 j (k + j ≦ 9)以及一個形如「0.ddd……」(d 為任意一個十進位之數字)之小數,代表循環節長度以及小數之值(小數結尾 j 個數字即為循環節部分)。
請將給定的小數轉為分數並約分後輸出。輸出格式參見範例輸出。
範例輸入:
2 0.318
1 0.3
2 0.09
6 0.714285
-1
範例輸出:
Case 1: 7/22
Case 2: 1/3
Case 3: 1/11
Case 4: 5/7
解題思維:
觀察公式可得分子部分即為小數點後的數值(非循環節與循環節合併)減去非循環節之數字,例如 j = 1 、 0.123 為 123 - 12;而分母就是單純地是 10 ^ (j + k) - 10 ^ j。
因此例如 j = 1 、 0.123 將會得到分數 (123 - 12) ÷ 990;j = 2 、 0.09 會得到 (9 - 0) ÷ 99。
而因為 j 可以為 0,也就是給定的小數為有限循環小數。此時分子就是小數部分、分母則為 10 ^ k。例如 j = 0 、 0.7 將得到 7 ÷ 10;j = 0 、 0.579 會得到 579 ÷ 1000。
最後利用輾轉相除法求得分子分母的最大公因數便可以將分數約至最簡分數,之後輸出即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。