切換
舊版
前往
大廳
主題

ZeroJudge - e864: Q3-2 循環小數 解題心得

Not In My Back Yard | 2020-03-11 01:21:03 | 巴幣 2 | 人氣 290

題目連結:


題目大意:
給定一正整數 n ,代表有  n 筆測試資料,每筆佔一列。每列給定兩正整數 A 、 B ,彼此之間以一個或多個空白分隔開,依序代表被除數以及除數。

請算出 A ÷ B 的值並以小數點表示。當小數出現循環節時,請用「()」框住循環節;如果沒有循環節的部分出現,則在結尾加上「(0)」;如果小數部分超過 50 位數,則取小數前 50 位,並先以「...」作結之後再整個以「()」框起;



範例輸入:
範例輸入一:
3
76 25
5 43
1 397

範例輸入二:
3
1 6
5 7
1 250


範例輸出:
範例輸出一:
3.04(0)
0.(116279069767441860465)
0.(00251889168765743073047858942065491183879093198992...)

範例輸出二:
0.1(6)
0.(714285)
0.004(0)


解題思維:
如果有做過與此題類似的取根號題,則直式的除法應該難不倒讀者們。就單純的先算出小數前的商值 floor(A ÷ B)(floor 為下高斯,在正整數域等同於無條件捨去)。

紀錄剛剛的餘數 r = A % B 或寫作 A mod B,則小數點第一位的值即是 floor( r × 10 除以 B) ,然後將該式得到的餘數當作下一個迭代的「r」(先前的 r 要記錄起來,因為要判斷循環節)。

如果有任何的「r」與「之前的 r 」重複,代表再做下去也只是重複先前做過的運算,因此此時的 r 以及之前的 r 各自出現的位置即是循環節的開頭以及結尾。

如果 r 到達了 0 ,則代表 A 是可以被 B 整除的。

其他要注意的就是位數的計數,記得不能超過 50 位數。而因為數字 A 、 B 都會在 32 位有號整數的範圍內(雖然題目未提及,只有提到是正整數),因此不須擔心要使用大數運算。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作