同題: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