1009: 高精度之加法
Description
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
Input
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
Output
输出一行,表示a + b的值。
Sample Input
20100122201001221234567890
2010012220100122
Sample Output
20100122203011233454668012
思路:
用一个carry记录进位,数组逆序存储,模拟加法运算。注意最后如果carry不为零,则还需进位。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=109;
char x[maxn],y[maxn];
int a[maxn],b[maxn],c[maxn];
int main()
{
while(cin>>x>>y)
{
memset(a,0,sizeof a);
memset(b,0,sizeof b);//a,b两个数组存储加数
memset(c,0,sizeof c);//c数组存储二者之和
int len1=strlen(x),len2=strlen(y);
for(int i=len1-1,j=0; i>=0; i--,j++)//逆序存储,为了后面方便处理进位问题,如果0位存储最高位那么如果此时还有进位那将会难以处理,而且逆序相加还有利于计算时下标的处理
a[j]=x[i]-'0';
for(int i=len2-1,j=0; i>=0; i--,j++)
b[j]=y[i]-'0';
int carry=0,i;//carry记录进位
for(i=0; i<max(len1,len2); i++)
{
c[i]=a[i]+b[i]+carry;
carry=c[i]/10;
c[i]=c[i]%10;
}
c[i]=carry;//很重要,如果最后carry不为零,则还需要进位
while(c[i]==0) i--;//除去前导零
if(i<0) cout<<"0";//处理结果为零的情况
for(int j=i; j>=0; j--) cout<<c[j];
cout<<endl;
}
return 0;
}