[CPE一星49題] UVA11332 - Summing Digits 題目解析與實作
編輯製作: 蔡豐聲、莊祺仁
單位: 中國醫藥大學 醫療資訊學系 程式俱樂部
YT: https://youtu.be/DK5XAASqjqU
YT (番外篇): https://youtu.be/XhdPvJqL2Xs
## 題目資訊
- 題目名稱: Summing Digits
- 編號: CPE10473, UVA11332
- 相關平台: Zero Judge, Online Judge
## 題目解析
對於所有正整數 $n$,我們定義一個函數 $f(n)$ 為 $n$ 的每一個十進位數字的總和。若不斷將結果代入函數中(即 $f(n), f(f(n)), f(f(f(n)))\dots$),最終會得到一個僅有一位數的值,我們定義該值為 $g(n)$。
例如:
若 $n = 1234567892$
$f(n) = 1+2+3+4+5+6+7+8+9+2 = 47$
$f(f(n)) = 4+7 = 11$
$f(f(f(n))) = 1+1 = 2$
因此,$g(1234567892) = 2$。
## 輸入說明
每列包含一個正整數,其值最大可達 $2 \times 10^9$。
輸入以 0 作為結束,該值不需要處理輸出。
## 輸出說明
對於每個輸入的 $n$,輸出對應的 $g(n)$。
## 範例測試
- 輸入:
2
11
47
1234567892
0
- 輸出:
2
2
2
2
## 解題思路
- 方法 I : 迴圈拆解法
- 處理連續輸入,使用
sys.stdin讀入所有資料。 - 重複計算位數和,當數字的長度大於 1 時(即還不是個位數),持續執行相加動作。
- 將數字轉為字串以方便拆解每個位數,計算後再存回。
- 遇到輸入為 "0" 時停止程式。
- 方法 II : 「九餘數(Digital Root)」
- 對於正整數 $n$,其數字根等於 $n \pmod 9$。若結果為 0 且 $n > 0$,則數字根為 9。
- 如果你想挑戰更簡短的寫法,可以嘗試用 $(n - 1) \% 9 + 1$ 來代替內層的
while迴圈。
## 實作程式碼 (Python)
import sys
# 用sys.stdin讀入所有的測試資料
for line in sys.stdin:
# 用while執行f(•)直到只剩一個數字
while(len(line) > 1):
# 把所有位數加起來
line = str(sum(map(int, line.strip())))
# 印出所有只剩一個數字的除了零
if line != "0":
print(line)