【每日一题之Day1】大整数加法
【题目描述】
求两个不超过200位的非负数整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,相加后的结果。结果不能有多余的前导0。
【样例输入】
131452
111111
【样例输出】
242562
【思路】
- 倒序存储
倒叙存储的原因
1、要采用竖式加法,进位处理比较方便。
2、竖式加法中数字从左到右是高位到低位,但是数组存储后相加采用竖式相加的话就要把数字也变成从左到右为高位到低位,所以要将数组中数字采用倒序存储。
原始数组al
原始数组bl
a和数组b
相加后形成的数组
- 进位处理
while(cl<=la||cl<=lb)
{
c[cl]=a[cl]+b[cl]+x;
x=c[cl]/10;
c[cl[=c[cl]%10;
cl++;
}
其中x=c[cl]/10;是向高位进位
c[cl]%=10;是存储第cl位的值
【源程序】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[2000],b[2000],c[2000];
char al[2000],bl[2000];
int main(){
int la,lb,lc,x=0;
cin>>al;cin>>bl;
la=strlen(al),lb=strlen(bl);
for(int i=0;i<la;i++) a[la-i]=al[i]-48;
for(int i=0;i<lb;i++) b[lb-i]=bl[i]-48;
//倒序存储
lc=1;
while(lc<=la||lc<=lb){
c[lc]=a[lc]+b[lc]+x;
x=c[lc]/10;//判断是否进一
c[lc]%=10;//留下相加后数的个位
lc++;
}
c[lc]=x;
//进位处理
while(lc>0&&c[lc]==0) lc--;//去掉多余前导0
for(int i=lc;i>=1;i--) cout<<c[i];
//倒序输出
cout<<endl;
system("pause");
return 0;
}