【大數加法】【51Nod
阿新 • • 發佈:2018-12-19
題目:
給出2個大整數A,B,計算A+B的結果。
Input
第1行:大數A 第2行:大數B (A,B的長度 <= 10000 需注意:A B有可能為負數)
Output
輸出A + B
Sample Input
68932147586
468711654886
Sample Output
537643802472
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char aa[100010],bb[100010]; int a[100010],b[100010],c[100010]; int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%s%s",aa,bb); int la=strlen(aa); int lb=strlen(bb); for(int i=la-1,j=0;i>0;i--) //反轉字串(不包含 首個字元); a[j++]=aa[i]-'0'; if(aa[0]=='-') { for(int i=0;i<la-1;i++) //把 首字元 填入a[]陣列中; a[i]=-a[i]; } else a[la-1]=aa[0]-'0'; for(int i=lb-1,j=0;i>0;i--) b[j++]=bb[i]-'0'; if(bb[0]=='-') { for(int i=0;i<lb-1;i++) b[i]=-b[i]; } else b[lb-1]=bb[0]-'0'; int lc=max(la,lb); int p,r=0; for(int i=0;i<lc;i++) { p=a[i]+b[i]+r; r=p/10; c[i]=p%10; } if(r) c[lc++]=r; while(lc>1&&c[lc-1]==0) //略過 前面的0; lc--; int flag=0; if(c[lc-1]>=0) //A,B相加為正; { flag=1; for(int i=0;i<lc;i++) { while(c[i]<0) { c[i+1]--; c[i]+=10; } } } else { flag=-1; for(int i=0;i<lc;i++) { while(c[i]>0) { c[i+1]++; c[i]-=10; } } } if(flag<0) printf("-"); while(lc>1&&c[lc-1]==0) lc--; for(int i=lc-1;i>=0;i--) printf("%d",abs(c[i])); printf("\n"); }