[CPE一星49題] UVA11332 - Summing Digits 題目解析與實作


編輯製作:
 蔡豐聲、莊祺仁 

單位: 中國醫藥大學 醫療資訊學系 程式俱樂部

 YT: https://youtu.be/DK5XAASqjqU

 YT (番外篇): https://youtu.be/XhdPvJqL2Xs

## 題目資訊

  • 題目名稱: Summing Digits
  • 編號: CPE10473, UVA11332

## 題目解析

對於所有正整數 $n$,我們定義一個函數 $f(n)$ 為 $n$ 的每一個十進位數字的總和。若不斷將結果代入函數中(即 $f(n), f(f(n)), f(f(f(n)))\dots$),最終會得到一個僅有一位數的值,我們定義該值為 $g(n)$

例如:

若 $n = 1234567892$

  1. $f(n) = 1+2+3+4+5+6+7+8+9+2 = 47$

  2. $f(f(n)) = 4+7 = 11$

  3. $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 :  迴圈拆解法
  1. 處理連續輸入,使用 sys.stdin 讀入所有資料。
  2. 重複計算位數和,當數字的長度大於 1 時(即還不是個位數),持續執行相加動作。
  3. 將數字轉為字串以方便拆解每個位數,計算後再存回。
  4. 遇到輸入為 "0" 時停止程式。
  • 方法 II :  「九餘數(Digital Root)」
  1. 對於正整數 $n$,其數字根等於 $n \pmod 9$。若結果為 0 且 $n > 0$,則數字根為 9。
  2. 如果你想挑戰更簡短的寫法,可以嘗試用 $(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)