大数加法

给出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("\n"); 
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("\n"); 
71     return 0;
72 }

坑爹啊,加法为什么要有负数。

题目来源:51Nod

posted @ 2017-02-03 17:39  J_william  阅读(521)  评论(0编辑  收藏  举报