1168:大整数加法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 69283 通过数: 22982
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222 33333333333333333333
【输出样例】
55555555555555555555
【思路】
输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在C++语言中任何数据类型都有一定的表示范围。而当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。 这样,我们方便写出两个整数相加的算法。
如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。则上例有A[1]=6,A[2]=5, A[3]=8,B[1]=5,B[2]=5,B[3]=2,C[4]=1,C[3]=1,C[2]=1,C[1]=1,两数相加如图2所示。
【源代码】
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[201],b1[201];
int a[201]={},b[201]={},c[201]={};//a,b,c分别存储被加数、加数、结果
scanf("%s",a1);
scanf("%s",b1);
int alen,blen,clen;
alen=strlen(a1);
blen=strlen(b1);
clen=1;
for(int i=0;i<alen;i++) a[alen-i]=a1[i]-'0';//通过字符串a1,b1把加数放入a,b数组
for(int i=0;i<blen;i++) b[blen-i]=b1[i]-'0';
int x=0;
while(clen<=alen||clen<=blen)
{
c[clen]=a[clen]+b[clen]+x;//两数相加
x=c[clen]/10;
c[clen]%=10;
clen++;
}
c[clen]=x;//处理最高进位
for(int i=clen;i>=1;i--)//删除前导零
{
if((c[i]==0)&&(clen>1)) clen--;
else break;
}
for(int i=clen;i>=1;i--)//输出结果
{
cout<<c[i];
}
cout<<endl;
return 0;
}