[CPE一星49題] UVA10035 - Primary Arithmetic 題目解析與實作


編輯製作:
 莊祺蔡豐聲 

出品團隊 中國醫藥大學 醫療資訊學系 程式俱樂部

 YT: https://youtu.be/1xNzLtP_jA0

## 題目資訊

  • 題目名稱: Primary Arithmetic
  • 編號: CPE10404, UVA10035 

## 題目解析

在小學時我們都做過加法的運算,就是把 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 的除法運算子

  1.  / :浮點數除法(例如 `5 / 2 = 2.5`)。
  2.  // :整數除法 / 取商數(例如 `5 // 2 = 2`)。
  3.  % :取餘數(例如 `5 % 2 = 1`)。

  • 如何取出所需的位數?
  1. 取出個位數:使用  % 10 。  例如:`456 % 10 = 6`
  2. 去掉個位數(向右移位):使用  // 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.")