ʕ·͡ˑ·ཻ ʕ•̫͡• ʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ

10:大整数加法

描述

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

输入

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

输出

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

样例输入

1
2
22222222222222222222
33333333333333333333

样例输出

1
55555555555555555555

AC代码:

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
41
42
43
#include<bits/stdc++.h>
using namespace std;

const int N = 205;

int a[N];
int b[N];
int c[N];

int main(){
string s1,s2;
cin>>s1>>s2;
int len1 = s1.length();
int len2 = s2.length();
while(len1<len2){
//写的时候感觉这一步很巧妙,因为貌似有道题我用了很麻烦的方法加上前导0
s1 = "0" + s1;
++len1;
}
while(len1>len2){
s2 = "0" + s2;
++len2;
}
for(int i=0;i<len1;i++){
a[i] = s1[len1-1-i]-'0';
b[i] = s2[len1-1-i]-'0';
}
int len = 0;
int x = 0;
//之所以是len<=len1两数相加的时候把它的结果最高位不管进不进位都多当作进位(后续有消除前导0操作
while(len<=len1){
c[len] = a[len] + b[len] + x;
x = c[len] / 10;
c[len] %= 10;
++len;
}
//这一步是消除前导0,之前WA了是因为0+0时把0给消除了所以我增加了len>1
while(!c[len-1]&&len>1) --len;
for(int i=len-1;i>=0;i--){
cout<<c[i];
}
return 0;
}