给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
代码实现:
1 #include<cstdio> 2 #include<cstring> 3 int la,lb,lc,qa=1,qb=1; 4 int a[10010],b[10010],c[10010]; 5 char ch[10010],cn[10010]; 6 bool p; 7 bool bj(){ 8 if(la>lb) return 1; 9 if(la<lb) return 0; 10 for(int i=0;i<la;i++){ 11 if(ch[i+1-qa]>cn[i+1-qb]) return 1; 12 if(ch[i+1-qa]<cn[i+1-qb]) return 0; 13 } 14 return 1; 15 } 16 void add(){ 17 lc=la; 18 for(int i=0;i<la;i++){ 19 c[i]+=a[i]+b[i]; 20 if(c[i]>9){ 21 c[i+1]++; 22 c[i]%=10; 23 if(i+1==la) lc++; 24 } 25 } 26 } 27 void cut(){ 28 lc=la; 29 for(int i=0;i<la;i++){ 30 c[i]+=a[i]-b[i]; 31 if(c[i]<0){ 32 a[i+1]--; 33 c[i]+=10; 34 } 35 } 36 while(!c[lc-1]&&lc>1) lc--; 37 } 38 int main(){ 39 scanf("%s%s",&ch,&cn); 40 la=strlen(ch);lb=strlen(cn); 41 if(ch[0]=='-') la--,qa--; 42 if(cn[0]=='-') lb--,qb--; 43 p=bj(); 44 if(p){ 45 for(int i=0;i<la;i++) a[i]=ch[la-i-qa]-'0'; 46 for(int i=0;i<lb;i++) b[i]=cn[lb-i-qb]-'0'; 47 } 48 else{ 49 for(int i=0;i<lb;i++) a[i]=cn[lb-i-qb]-'0'; 50 for(int i=0;i<la;i++) b[i]=ch[la-i-qa]-'0'; 51 lc=la;la=lb;lb=lc; 52 } 53 if((ch[0]=='-'&&cn[0]!='-')||(ch[0]!='-'&&cn[0]=='-')) cut(); 54 else add(); 55 if((ch[0]==cn[0]=='-'||(p&&ch[0]=='-')||(p==0&&cn[0]=='-'))&&(lc>1||c[0])) printf("-"); 56 for(int i=lc-1;i>=0;i--) printf("%d",c[i]); 57 printf(" "); 58 return 0; 59 }
附带压位优化的版本:
1 #include<cstdio> 2 #include<cstring> 3 int la,lb,lc,qa=1,qb=1; 4 int a[10010],b[10010],c[10010]; 5 char ch[10010],cn[10010]; 6 bool p; 7 bool bj(){ 8 if(la>lb) return 1; 9 if(la<lb) return 0; 10 for(int i=0;i<la;i++){ 11 if(ch[i+1-qa]>cn[i+1-qb]) return 1; 12 if(ch[i+1-qa]<cn[i+1-qb]) return 0; 13 } 14 return 1; 15 } 16 void add(){ 17 lc=la; 18 for(int i=0;i<=la;i++){ 19 c[i]+=a[i]+b[i]; 20 if(c[i]>99999999){ 21 c[i+1]++; 22 c[i]%=100000000; 23 if(i+1==la) lc++; 24 } 25 } 26 } 27 void cut(){ 28 lc=la; 29 for(int i=0;i<=la;i++){ 30 c[i]+=a[i]-b[i]; 31 if(c[i]<0){ 32 a[i+1]--; 33 c[i]+=100000000; 34 } 35 } 36 } 37 int main(){ 38 scanf("%s%s",&ch,&cn); 39 la=strlen(ch);lb=strlen(cn); 40 if(ch[0]=='-') la--,qa--; 41 if(cn[0]=='-') lb--,qb--; 42 p=bj(); 43 if(p){ 44 for(int i=0;i<la;i++) a[i]=ch[la-i-qa]-'0'; 45 for(int i=0;i<lb;i++) b[i]=cn[lb-i-qb]-'0'; 46 } 47 else{ 48 for(int i=0;i<lb;i++) a[i]=cn[lb-i-qb]-'0'; 49 for(int i=0;i<la;i++) b[i]=ch[la-i-qa]-'0'; 50 lc=la;la=lb;lb=lc; 51 } 52 for(int i=0;i<=la/8;i++) 53 for(int j=0,k=1;j<8;j++,k*=10) c[i]+=a[8*i+j]*k; 54 for(int i=0;i<la;i++) a[i]=0; 55 for(int i=0;i<la;i++){a[i]=c[i];c[i]=0;} 56 while(!a[la]) la--; 57 for(int i=0;i<=lb/8;i++) 58 for(int j=0,k=1;j<8;j++,k*=10) c[i]+=b[8*i+j]*k; 59 for(int i=0;i<lb;i++) b[i]=0; 60 for(int i=0;i<lb;i++){b[i]=c[i];c[i]=0;} 61 while(!b[lb]) lb--; 62 if((ch[0]=='-'&&cn[0]!='-')||(ch[0]!='-'&&cn[0]=='-')) cut(); 63 else add(); 64 if((ch[0]==cn[0]=='-'||(p&&ch[0]=='-')||(p==0&&cn[0]=='-'))&&(lc>1||c[0])) printf("-"); 65 while(!c[lc]&&lc>0) lc--; 66 for(int i=lc;i>=0;i--){ 67 if(i!=lc) for(int j=10000000;j>c[i]&&j>1;j/=10) printf("0"); 68 printf("%d",c[i]); 69 } 70 printf(" "); 71 return 0; 72 }
坑爹啊,加法为什么要有负数。
题目来源:51Nod