给出2个大整数A,B,计算A+B的结果。
Input第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output输出A + B
Sample Input
68932147586 468711654886Sample Output
537643802472
坑人!坑人!坑人!ヾ(≧へ≦)〃
我的大体框架分为两种:1.同号的情况(+ +与- -),其实质上就是相加,--只不过多个负号;2.异号的情况(+ -与- +),这里就比较麻烦了,还要判断长短以及大数的第一个数的大小。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 10005
char a[N],b[N];
int s1[N],s2[N],s3[N],s4[N];
int main()
{
int len1,len2,i,j,flag1,flag2,k,max;
while(scanf("%s%s",a,b)!=EOF)
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(s3,0,sizeof(s3));
memset(s4,0,sizeof(s4));
len1=strlen(a);
len2=strlen(b);
flag1=0;
flag2=0;
if(a[0]=='-')
{
flag1=1;
len1--; //如果含负号,长度减一,即减去-的长度//
}
if(b[0]=='-')
{
flag2=1;
len2--;
}
if(flag1==0&&flag2==0)
{
for(i=0,j=len1-1;i<len1;i++,j--)
s1[i]=a[j]-'0';
for(i=0,j=len2-1;i<len2;i++,j--) //当a,b为+ +情况,存入s1数组情况//
s2[i]=b[j]-'0';
}
else if(flag1==1&&flag2==1)
{
for(i=0,j=len1;i<len1;i++,j--)
s1[i]=a[j]-'0';
for(i=0,j=len2;i<len2;i++,j--) //当a,b为- -情况//
s2[i]=b[j]-'0';
}
else if(flag1==0&&flag2==1)
{
for(i=0,j=len1-1;i<len1;i++,j--) //a,b + -情况//
s1[i]=a[j]-'0';
for(i=0,j=len2;i<len2;i++,j--)
s2[i]=b[j]-'0';
}
else if(flag1==1&&flag2==0)
{
for(i=0,j=len1;i<len1;i++,j--) //a,b - +情况//
s1[i]=a[j]-'0';
for(i=0,j=len2-1;i<len2;i++,j--)
s2[i]=b[j]-'0';
}
max=len1>len2?len1:len2; //判断最大长度//
k=0;
if(flag1==flag2) //同号的情况//
{
for(i=0;i<max;i++)
{
s3[i]=(s1[i]+s2[i]+k)%10;
k=(s1[i]+s2[i]+k)/10;
}
if(flag1==1&&flag2==1)
printf("-");
if(k!=0)
printf("1");
for(i=max-1;i>=0;i--)
printf("%d",s3[i]);
printf("\n");
}
else //异号的情况//
{
for(i=0;i<max;i++)
{
if(max==1&&s1[0]<s2[0])
s4[i]=s2[i]-s1[i]; //当只有一个数异号的时候,比如4,-9//
else
{
if(flag1==1&&flag2==0) //当- +情况的时候//
{
if(len1>len2)
s4[i]=s1[i]-s2[i]; //哪个长度大,以哪个放在前面减去后面的//
else if(len1==len2&&s1[len1-1]>s2[len2-1])
s4[i]=s1[i]-s2[i]; //长度相等时比较第一个数字大小//
else if(len1==len2&&s1[len1-1]<s2[len2-1])
s4[i]=s2[i]-s1[i];
else
s4[i]=s2[i]-s1[i];
}
else if(flag1==0&&flag2==1) //当+ -情况的时候//
{
if(len1>len2)
s4[i]=s1[i]-s2[i];
else if(len1==len2&&s1[len1-1]>s2[len2-1])
s4[i]=s1[i]-s2[i];
else if(len1==len2&&s1[len1-1]<s2[len2-1])
s4[i]=s2[i]-s1[i];
else
s4[i]=s2[i]-s1[i];
}
}
}
for(i=0;i<max;i++)
{
if(s4[i]<0)
{
while(s4[i]<0)
{
s4[i+1]=s4[i+1]-1;
s4[i]=s4[i]+10;
}
}
}
if(len1>len2&&flag1==1)
printf("-");
else if(len1<len2&&flag2==1)
printf("-");
else if(len1==len2&&s1[max-1]>s2[max-1]&&flag1==1)
printf("-");
else if(len1==len2&&s1[max-1]<s2[max-1]&&flag2==1)
printf("-");
while(s4[max-1]==0) //除去多余的0,比如你可能会输出0000009这种情况,我们需要去掉多余的0,直接输出9//
{
if(s4[max-1]==0)
max--;
}
for(i=max-1;i>=0;i--)
printf("%d",s4[i]);
printf("\n");
}
}
return 0;
}