51nod 1005 大数加法

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出2个大整数A,B,计算A+B的结果。
 
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[10010],s2[10010],ss1[10010],ss2[10010];
int len1,len2,a[10010],b[10010],c[10010];
bool f1,f2;
void add(int *k1,int *k2)
{
    c[0]=max(k1[0],k2[0]);
    for(int i=1;i<=c[0];i++)
    {
        c[i+1]=(k1[i]+k2[i]+c[i])/10;
        c[i]=(c[i]+k1[i]+k2[i])%10;
    }
    if(c[c[0]+1]) c[0]++;
    for(int i=c[0];i;i--) printf("%d",c[i]); 
}
void sub(int *k1,int *k2)
{
    c[0]=k1[0];int x=0;
    for(int i=1;i<=c[0];i++)
    {
        if(k1[i]<k2[i])
        {
            k1[i]+=10;
            k1[i+1]--;
        }
        c[i]=k1[i]-k2[i];
    }
    while(!c[c[0]]&&c[0]>1) c[0]--;
    for(int i=c[0];i;i--) printf("%d",c[i]);
}
int main()
{
    scanf("%s",s1);
    scanf("%s",s2);
    len1=strlen(s1);
    len2=strlen(s2);
    int i=0,j=0;
    if(s1[i]=='-') f1=true,i++;
    if(s2[j]=='-') f2=true,j++;
    int x1=0,y1=0;
    for(int x=i;x<len1;x++) ss1[x1++]=s1[x];
    for(int y=j;y<len2;y++) ss2[y1++]=s2[y];
    int x2=0,y2=0;
    for(int x=len1-1;x>=i;x--)
     a[++x2]=s1[x]-'0';
    for(int y=len2-1;y>=j;y--)
     b[++y2]=s2[y]-'0';
    a[0]=x2;b[0]=y2;
    if(f1==f2)
    {
        if(f1) putchar('-');
        add(a,b);
    }
    else if(f1)
    {
        if(strlen(ss1)==strlen(ss2)&&strcmp(ss1,ss2)>0||strlen(ss1)>strlen(ss2))  { putchar('-'); sub(a,b);}
        else sub(b,a);
    }
    else
    {
        if(strlen(ss1)==strlen(ss2)&&strcmp(ss1,ss2)>=0||strlen(ss1)>strlen(ss2)) sub(a,b);
        else { putchar('-'); sub(b,a); }
    }
}

 

错误1:

加法中:c[i]=(c[i]+k1[i]+k2[i])%10;

写成 c[i]+=(k1[i]+k2[i])%10;

可能会使c[i]=10

错误2:

加法中

c[i+1]=(k1[i]+k2[i]+c[i])/10;

c[i]=(c[i]+k1[i]+k2[i])%10;

顺序颠倒

 

错误3:

减法比较大小直接写strcmp(ss1,ss2)>0,错误

因为strcmp的比较原则是逐位比较,所以要先判断长度

posted @ 2017-03-27 08:26  TRTTG  阅读(260)  评论(0编辑  收藏  举报