简单高精度加法
题目描述:修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A、B的和,其中A和B的位数在5000位以内。
输入:共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在5000以内。
输出:输出一个非负数,即两数之和。
样例输入:
1111111111
2222222222
样例输出:
3333333333
可以算是最基础的高精度算法了,不过既然是高精度,就说明至少double也装不下,需要用字符串处理。
##include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5000
char a[N],b[N];
int aa[N],bb[N],ans[N]={0};
int max(int x,int y)
{
if(x>y) return x;
else return y;
}
int main()
{
int i,j,stra,strb,maxlen;
scanf("%s%s",a,b);
stra=strlen(a);//计算长度
strb=strlen(b);
for(i=stra-1,j=0;i>=0;i--,j++)
{
aa[j]=a[i]-'0';//每一位转化为数字
}
for(i=strb-1,j=0;i>=0;i--,j++)
{
bb[j]=b[i]-'0';
}
maxlen=max(stra,strb);
for(i=0;i<maxlen+1;i++)
{
if(aa[i]+bb[i]+ans[i]<10) ans[i]=ans[i]+aa[i]+bb[i];
else//处理进位问题
{
ans[i]=(aa[i]+bb[i]+ans[i])%10;
ans[i+1]=1;
}
}
if(ans[maxlen]!=0)//最后结果有可能多一位
{
for(i=maxlen;i>=0;i--) printf("%d",ans[i]);
}
else
{
for(i=maxlen-1;i>=0;i--) printf("%d",ans[i]);
}
printf("\n");
return 0;
}