总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过 200 位的非负整数的和。
输入
有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。
输出
一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。
样例输入
1 2
| 22222222222222222222 33333333333333333333
|
样例输出
来源
程序设计实习 2007
思路
Code
C++
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 29 30 31 32 33 34 35 36 37 38 39 40
| #include <bits/stdc++.h> using namespace std;
int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); vector<char> s1, s2; array<int, 300> a {}; string str; for (int i = 1; i <= 2; i++) { cin >> str; for (auto j : str) { if (i == 1) s1.insert(s1.begin(), j); if (i == 2) s2.insert(s2.begin(), j); } } int j = 0; for (; j < (int)s1.size() && j < (int)s2.size(); j++) a[j] = s1[j]-'0' + (s2[j]-'0'); for (; j < (int)s1.size(); j++) a[j] = s1[j]-'0'; for (; j < (int)s2.size(); j++) a[j] = s2[j]-'0'; int count = j; for (int i = 0; i < j; i++) { a[i + 1] += a[i] / 10; if(i+1 == j && a[i] / 10 > 0) count++; a[i] = a[i] % 10; } int flag = 0; if(count - 1 > 0) { for(int i = count-1; i > -1; i--) { if(flag == 0) { if(a[i] != 0) { cout << a[i]; flag = 1; } } else if(flag == 1) cout << a[i]; } } else { for(int i = count-1; i > -1; i--) cout << a[i]; } }
|
错误操作
错误操作 1:空间不足
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 29 30 31 32 33 34 35 36 37 38 39 40
| #include <bits/stdc++.h> using namespace std;
int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); vector<char> s1, s2; array<int, 200> a {}; string str; for (int i = 1; i <= 2; i++) { cin >> str; for (auto j : str) { if (i == 1) s1.insert(s1.begin(), j); if (i == 2) s2.insert(s2.begin(), j); } } int j = 0; for (; j < (int)s1.size() && j < (int)s2.size(); j++) a[j] = s1[j]-'0' + (s2[j]-'0'); for (; j < (int)s1.size(); j++) a[j] = s1[j]-'0'; for (; j < (int)s2.size(); j++) a[j] = s2[j]-'0'; int count = j; for (int i = 0; i < j; i++) { a[i + 1] += a[i] / 10; if(i+1 == j && a[i] / 10 > 0) count++; a[i] = a[i] % 10; } int flag = 0; if(count - 1 > 0) { for(int i = count-1; i > -1; i--) { if(flag == 0) { if(a[i] != 0) { cout << a[i]; flag = 1; } } else if(flag == 1) cout << a[i]; } } else { for(int i = count-1; i > -1; i--) cout << a[i]; } }
|
错误原因
这里的 200
是数组的大小,但是题目中说了两个数的长度不超过 200
,所以这里的数组大小应该是 200
以上。
错误操作 2:未把 0+0
的情况考虑进去
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 29 30 31 32 33 34
| #include <bits/stdc++.h> using namespace std;
int main() { string num1 {0}, num2 {0}; cin >> num1; cin >> num2; long long unsigned int i = 0; for(; i < num1.size() && num1[i] == '0'; i++); num1.erase(0, i); i = 0; for(; i < num2.size() && num2[i] == '0'; i++); num2.erase(0, i); reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); long long unsigned int num1P = 0, num2P = 0; for(; num1P < num1.size() && num2P < num2.size(); num1P++, num2P++) { if((num1[num1P] - '0') + (num2[num2P] - '0') > 9 && num1P < num1.size()-1) { num1[num1P+1] += 1; num1[num1P] = (((num1[num1P] - '0') + (num2[num2P] - '0')) % 10) + '0'; } else if((num1[num1P] - '0') + (num2[num2P] - '0') > 9 && num1P == num1.size()-1) { num1.insert(num1.end(), '1'); num1[num1P] = (((num1[num1P] - '0') + (num2[num2P] - '0')) % 10) + '0'; } else { num1[num1P] = ((num1[num1P] - '0') + (num2[num2P] - '0')) + '0'; } } for(;num2P < num2.size(); num2P++) { num1.insert(num1.end(), num2[num2P]); } num1[num1.size()] = 0; reverse(num1.begin(), num1.end()); cout << num1; }
|
测试用例
测试用例 1
输入
1 2
| 22222222222222222222 33333333333333333333
|
输出
测试用例 2
输入
输出
测试用例 3
输入
输出