给出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; }