ZeroJudge C014: Primary Arithmetic

同題:UVa 10035 – Primary Arithmetic

在小學時我們都做過加法的運算,就是把 2 個整數靠右對齊然後,由右至左一位一位相加。如果相加的結果大於等於10就有進位 (Carry) 的情況出現。

你的任務就是要判斷2個整數相加時產生了幾次進位的情況。這將幫助小學老師分析加法題目的難度。

範例測資

範例輸入範例輸出
EOF 輸入,每一列測試資料有 2 個正整數,長度均小於 10 位。最後一列有 2 個 0 代表輸入結束。每列測試資料輸出該 2 數相加時產生多少次進位。注意進位超過 1 次時 operation 要加 s。
123 456
555 555
123 594
0 0
No carry operation.
3 carry operations.
1 carry operation.

解題思路

使用字串收數字,然後用最傳統的直式來做計算,可以先將兩個字串做反轉這樣跑 For迴圈 的時候可以從左跑到右。

範例程式碼-ZeroJudge C014: Primary Arithmetic

#include <iostream>
#include <algorithm>
using namespace std;

int toint(char a)
{
    return int(a - '0');
}

void output(int ans)
{
    if (ans == 0) cout << "No carry operation.\n";
    else if (ans == 1) cout << "1 carry operation.\n";
    else cout << ans << " carry operations.\n";
}

int main() {
    cin.sync_with_stdio(false);
    cin.tie(nullptr);
    int a, b;
    while (cin >> a >> b)
    {
        if (a == 0 && b == 0) break;
        else
        {
            if (a > b) swap(a, b);
            int count = 0;
            string one = to_string(a);
            string two = to_string(b);
            reverse(one.begin(), one.end());
            reverse(two.begin(), two.end());
            int carry = 0, ans = 0;
            for (int i = 0; i<max(one.length(), two.length()); i++)
            {
                int sum = carry;
                if(i < (int) one.size()) {
                    sum += one[i] - '0';
                }
                if(i < (int) two.size()) {
                    sum += two[i] - '0';
                }
                carry = (sum >= 10);
                ans += carry;
            }
            output(ans);
        }
    }
}

//ZeroJudge C014
//Dr. SeanXD

發佈留言