zoukankan      html  css  js  c++  java
  • 大数加法

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

  • 相关阅读:
    不错的电影(先收藏着)
    getchar() getch() getche() gets() puts() scanf()的用法及区别
    java反射获取字段的属性值,以及为字段赋值等方法
    oracle将查询结果横转纵
    关于MySQL 的LEFT JOIN ON的问题
    MySQL表名和数据库关键字相同解决办法
    ajax 后台正常执行 错误类型却是404
    BIT 树状数组 详解 及 例题
    HDU 2689 Sort it (树状数组)
    HDU Cow Sorting (树状数组)
  • 原文地址:https://www.cnblogs.com/J-william/p/6363129.html
Copyright © 2011-2022 走看看