[原創題]A+B Problem - 提示、題解
GuguGagaOJ #2 A+B Problem
[原創題]A+B Problem - 提示、題解
題目簡介
輸入兩行正整數,輸出其相加結果
提示
推薦打開之後想想看再繼續,不要一次使用全部
提示1
部分正確?看看測資限制可能會得到線索
提示2
如果一個整數裝不下的話,也許可以考慮不限制大小的資料型態?
提示3
用陣列好像沒有長度限制,但字串可能是更有效的資料型態!
提示4
做起來很複雜?反過來會不會比較好做?
提示5
你問怎麼反過來?C++的話試試看reverse()
題解
點開會有完整解答,請想過後再開喔
思路
在題述中,你會發現封鎖Python跟Java了,因為Python跟Java有內建的方式可以快速的解決這題。
題目中藏有小細節,往下滑你可以看到:$0 <= a_i, b_i <= 10^{300}$,直接使用int儲存肯定會超出空間,所以這題得另闢蹊徑。如果你有看提示的話應該有個構想,這邊讓我理出完整流程
- 輸入
n,並且讓程式循環n次 - 每次輸入
a,b兩個字串 - 然後開一個空的字串用來放答案
- 用
reverse(s.begin(), s.end())可以把字串s反過來 - 由前往後處理,加起來之後的結果放到答案裡面
想一下,如果兩個字串長度不同怎麼辦?
- 記得計算進位!可以用
bool儲存是否需要進位。 - 如果你用
ans += sum儲存的話,記得你的數字是反的,要改回來 - 輸出!
在下面完整程式碼的部分(要點開隱藏區塊)有一個視覺化程式的程式,如果不介意看到解答的話,透過視覺化可能可以幫助你思考。
這是標準的大數運算題目,遇到數字很大的時候可以把這東西記起來,很好用。
完整程式碼
請注意,本程式碼僅供寫法上參考,直接複製貼上程式碼會導致你學不到任何東西。
C++ 範例程式碼
這裡有簡化版的視覺化程式,可以自己調整a, b的數值來看處理數字時的過程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h>
using namespace std;
#define raymondwengcode ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
int main() {
raymondwengcode;
int n; cin >> n;
for (int k = 0; k < n; k++) {
string a, b;
cin >> a >> b;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
bool carry = false;
string ans = "";
for (int i = 0; carry || i < a.size() || i < b.size(); i++) {
int sum = carry ? 1 : 0;
if (i < a.size()) sum += a[i] - '0';
if (i < b.size()) sum += b[i] - '0';
ans += (sum % 10) + '0';
carry = sum >= 10;
}
reverse(ans.begin(), ans.end());
cout << ans << "\n";
}
return 0;
}
本文章以
CC BY 4.0
授權