抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总时间限制: 1000ms 内存限制: 65536kB

描述

求两个不超过 200 位的非负整数的和。

输入

有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。

输出

一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。

样例输入

1
2
22222222222222222222
33333333333333333333

样例输出

1
55555555555555555555

来源

程序设计实习 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];
}
}

错误原因

1
array<int, 200> a {};

这里的 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

输出

1
55555555555555555555

测试用例 2

输入

1
2
91
99

输出

1
190

测试用例 3

输入

1
2
0
0

输出

1
0