求两个不超过 200 位的非负整数的和。
输入格式
有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。
输出格式
一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
1、输入
cin >> a >> b;
2、求出长度备用
int aa = a.length();
int bb = b.length();
3、求出最大最小长度备用
int ss = min(aa, bb);
int ll = max(aa, bb);
4、翻转,就可以先计算低位了
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
5、按最短的加,注意字符0和数字0
for (int i = 0; i < ss; i++) {
ans += a[i] + b[i] - '0';
}
6、把剩下的补上
if (aa < bb) {
for (int i = ss; i < ll; i++) {
ans += b[i];
}
} else if (aa > bb) {
for (int i = ss; i < ll; i++) {
ans += a[i];
}
}
7、补个0,防止进位
ans += '0';
8、处理进位
for (int i = 0; i < ll + 1; i++) {
if (ans[i] > '9') {
ans[i + 1]++;
ans[i] -= 10;
}
}
9、转回来
reverse(ans.begin(), ans.end());
10、从第一个非0的输出
for (int i = ans.find_first_not_of('0'); i < ll + 1; i++) {
if (i == -1) {
cout << 0;
return 0;
}
cout << ans[i];
}
11、return 0
return 0;
完整代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string a, b, ans;
int main() {
cin >> a >> b;
int aa = a.length();
int bb = b.length();
int ss = min(aa, bb);
int ll = max(aa, bb);
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < ss; i++) {
ans += a[i] + b[i] - '0';
}
if (aa < bb) {
for (int i = ss; i < ll; i++) {
ans += b[i];
}
} else if (aa > bb) {
for (int i = ss; i < ll; i++) {
ans += a[i];
}
}
ans += '0';
for (int i = 0; i < ll + 1; i++) {
if (ans[i] > '9') {
ans[i + 1]++;
ans[i] -= 10;
}
}
reverse(ans.begin(), ans.end());
for (int i = ans.find_first_not_of('0'); i < ll + 1; i++) {
if (i == -1) {
cout << 0;
return 0;
}
cout << ans[i];
}
return 0;
}