1168:大整数加法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 30362 通过数: 9123
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
#include<bits/stdc++.h>
using namespace std;
int a[2005],b[2005],c[2005],la,lb,lc,x=0;
char a1[2005],b1[2005];
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
gets(a1);
gets(b1);
la = strlen(a1);
lb = strlen(b1);
for(int i=0;i<la;i++){
a[la-i-1]=a1[i]-'0'; // 要注意,这里是从数组的0开始,所以要-1 la-i-1
}
for(int i=0;i<lb;i++){
b[lb-i-1]=b1[i]-'0';
}
lc=0;
while(lc<max(la,lb)){ // 要运行到两个数最大的位数,才算完成
// printf("c[%d]=a[%d]+b[%d]+x=%d+%d+%d\n",lc,lc,lc,a[lc],b[lc],x);
c[lc] = a[lc] + b[lc] +x;
x = c[lc]/10;
c[lc] %= 10;
lc++;
}
c[lc] = x;
while(c[lc]==0){ // 舍去最后末尾的进位的0 ,当上面的x=0时候,会产生多一个进位0(乘法可能会多个0,所以用while舍去)
lc--;
}
// cout<<lc<<endl;
for(int i=lc;i>=0;i--){
cout<<c[i]; // 倒序输出,并且输出到0的位置
}
return 0;
}