[CPE一星49題] UVA10035 - Primary Arithmetic 題目解析與實作
編輯製作: 莊祺仁、蔡豐聲
出品團隊: 中國醫藥大學 醫療資訊學系 程式俱樂部
YT: https://youtu.be/1xNzLtP_jA0
## 題目資訊
- 題目名稱: Primary Arithmetic
- 編號: CPE10404, UVA10035
- 相關平台: Zero Judge, Online Judge
## 題目解析
在小學時我們都做過加法的運算,就是把 2 個整數靠右對齊然後,由右至左一位一位相加。如果相加的結果大於等於 10 就有進位(carry)的情況出現。本題任務就是要判斷 2 個整數相加時產生了幾次進位的情況,這將幫助小學老師分析加法題目的難度。
## 輸入說明
- 每一列測試資料有 2 個正整數,長度均小於 10 位。
最後一列有 2 個
0代表輸入結束。
## 輸出說明
- 每列測試資料輸出該 2 數相加時產生多少次進位。
- 注意:進位超過 1 次時
operation必須加s(即operations)。
## 範例測試
- 輸入:
123 456
555 555
123 594
0 0
- 輸出:
No carry operation.
3 carry operations.
1 carry operation.
## 解題思路
- Python 的除法運算子:
- / :浮點數除法(例如 `5 / 2 = 2.5`)。
- // :整數除法 / 取商數(例如 `5 // 2 = 2`)。
- % :取餘數(例如 `5 % 2 = 1`)。
- 如何取出所需的位數?
- 取出個位數:使用 % 10 。 例如:`456 % 10 = 6`
- 去掉個位數(向右移位):使用 // 10 。 * 例如:`456 // 10 = 45`
## 實作程式碼 (Python)
import sys
# 1. 從標準輸入 (stdin) 逐行讀取資料
for line in sys.stdin:
# 將讀入的一行文字以空白分割,並轉換成整數 n 與 m
n, m = map(int, line.split())
# 2. 題目規定的終止條件:當 n 和 m 同時為 0 時結束迴圈
if n == 0 and m == 0:
break
carry = 0 # 記錄當前位數的進位 (0 或 1)
total_carry = 0 # 記錄總共發生了幾次進位
# 3. 開始進行加法,當 n 或 m 還沒被完全處理完時 (大於 0),持續進行逐位加法
while n > 0 or m > 0:
# 取出 n 與 m 目前個位數的數字
a, b = n % 10, m % 10
# 將 n 與 m 去掉個位數 (向右移位)
n, m = n // 10, m // 10
# 檢查當前位數相加加上前一個進位是否大於等於 10
if a + b + carry >= 10:
total_carry += 1 # 總進位次數加 1
carry = 1 # 產生向左的進位,設定為 1
else:
carry = 0 # 沒有產生進位,設定為 0
# 4. 根據總進位次數輸出對應格式的結果
if total_carry == 0:
print("No carry operation.")
elif total_carry == 1:
print("1 carry operation.")
else:
print(total_carry, "carry operations.")