51nod 1005大数相加(包含负数)

大数加法

 

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

我今天真是神经了,不知道怎么回事,一个a+b写了300+的代码。。。

AC代码如下:

#include
#include
#include
#include
using namespace std;
const int maxn = 1e4+10;
char s1[maxn];
char s2[maxn];
int a[maxn];
int b[maxn];
int c[maxn];

int main()
{
    int f1=0,f2=0;
    int flag=0;
    int h=-1;
    scanf("%s%s",s1,s2);
    if(s1[0]=='-')  f1=1;
    if(s2[0]=='-')  f2=1;
    int m=strlen(s1);
    int n=strlen(s2);
    int len1=0,len2=0;
    if(!f1&&!f2)    //两数均为非负数
    {
        for(int i=m-1;i>=0;i--)//字符数组转换为整形数组
        {
            a[len1++]=s1[i]-'0';
        }
        for(int i=n-1;i>=0;i--)
        {
            b[len2++]=s2[i]-'0';
        }
        for(int i=0;i9)//考虑到下一位进1之后可能又大于10,所以用while一直进位到不能再进位
            {
                c[i]-=10;
                c[i+1]++;
            }
        }
        if(c[max(len1,len2)])//判断两数相加之后位数增多的情况,比如999+1,如果没有这一步,那么进行下一步的输出c[i],这样会少一位,少了1000中的1
            printf("%d",c[max(len1,len2)]);
        for(int i=max(len1,len2)-1;i>=0;i--)
            printf("%d",c[i]);
        printf("\n");
    }
    else if(f1==1&&f2==1)//两数均为负数,同上一种情况,输出前加上负号即可
    {
        for(int i=m-1;i>0;i--)
        {
            a[len1++]=s1[i]-'0';
        }
        for(int i=n-1;i>0;i--)
        {
            b[len2++]=s2[i]-'0';
        }
        for(int i=0;i9)
            {
                c[i]-=10;
                c[i+1]++;
            }
        }
        printf("-");
        if(c[max(len1,len2)])
            printf("%d",c[max(len1,len2)]);
        for(int i=max(len1,len2)-1;i>=0;i--)
            printf("%d",c[i]);
        printf("\n");
    }
    else//一正一负,这里分两种情况讨论,一种是这两个数的位数相等,另一种是位数不等。
    {
        if(f1==1)//字符数组转换为整形数组
        {
            for(int i=m-1;i>0;i--)
            {
                a[len1++]=s1[i]-'0';
            }
            for(int i=n-1;i>=0;i--)
            {
                b[len2++]=s2[i]-'0';
            }
        }
        if(f2==1)//同上
        {
            for(int i=m-1;i>=0;i--)
            {
                a[len1++]=s1[i]-'0';
            }
            for(int i=n-1;i>0;i--)
            {
                b[len2++]=s2[i]-'0';
            }
        }
        int maxx=max(len1,len2);
        int flag=0;
        if(len1==len2)  flag=1;
        if(flag)//位数相等时,不考虑负号,用较大数减较小数,再根据a和b的正负判断即可
        {
            int maxxx=0;
            for(int i=len1-1;i>=0;i--)//判断这两个位数相等的数谁大谁小,如果相等,直接输出0
            {
                if(a[i]>b[i])
                {
                    maxxx=1;
                    break;
                }
                if(b[i]>a[i])
                {
                    maxxx=2;
                    break;
                }
            }
            if(maxxx==0)//两数相等,输出0
            {
                printf("0\n");
                return 0;
            }
            if(maxxx==1)//a大于b时
            {
                for(int i=0;ia[i])
                    {
                        c[i]+=a[i]+10-b[i];
                        for(int j=i+1;j=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            printf("%d",c[i]);
                            h=i;
                        }
                    }
                }
                if(f2==1)//b为负数
                {
                    for(int i=maxx-1;i>=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }
                }
            }
            if(maxxx==2)//b大于a时
            {
                for(int i=0;ib[i])
                    {
                        c[i]+=b[i]+10-a[i];
                        for(int j=i+1;j=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                           printf("%d",c[i]);
                           h=i;
                        }
                    }
                }
                if(f1==1)//a为负数
                {
                    for(int i=maxx-1;i>=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }
                }
            }
        }
        else//位数不相等,不考虑负号,位数长的一定比位数短的数大,直接用较大数减较小数,再根据a和b的正负情况判断即可
        {
            if(maxx==len1)//如果a的位数长
            {
                for(int i=0;ia[i])
                    {
                        c[i]+=a[i]+10-b[i];
                        for(int j=i+1;j=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }

                else//a为负数
                {
                    printf("-");
                    for(int i=maxx-1;i>=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }
                }
            }
            if(maxx==len2)//b的位数大
            {
                for(int i=0;ib[i])
                    {
                        c[i]+=b[i]+10-a[i];
                        for(int j=i+1;j=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }
                else//b为负数
                {
                    printf("-");
                    for(int i=maxx-1;i>=0;i--)
                    {
                        if(c[i]||i<=h)
                        {
                            h=i;
                            printf("%d",c[i]);
                        }
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}

后来看别人写的,顿时发现没那么复杂,100+就搞定了,甚至有的70+就弄出来了,emmmm,备受打击

#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1e4+10;
int ans[maxn];
int ra[maxn];
int rb[maxn];
void bigadd(string a,string b)//a+b
{
    int l1=a.length();
    int l2=b.length();
    for(int i=0;i9)
        {
            ans[i]-=10;
            ans[i+1]++;
        }
    }
    if(ans[max(l1,l2)])
        printf("%d",ans[max(l1,l2)]);
    for(int i=max(l1,l2)-1;i>=0;i--)
        printf("%d",ans[i]);
    puts("");
}

void bigsub(string a,string b)//a-b
{
    int l1=a.length();
    int l2=b.length();
    for(int i=0;ira[i])
        {
            ans[i]+=ra[i]+10-rb[i];
            for(int j=i+1;j=0;i--)
    {
        if(ans[i]||ib;
    return a.length()>b.length();
}

int main()
{
    string a,b;
    int f1=0,f2=0;
    int l1=a.length();
    int l2=b.length();
    cin>>a>>b;
    if(a[0]=='-')   f1=1;
    if(b[0]=='-')   f2=1;
    if(!f1&&!f2)
        bigadd(a,b);
    else if(f1&&f2)
    {
        string c=a.substr(1,l1-1);
        string d=b.substr(1,l2-1);
        putchar('-');
        bigadd(c,d);
    }
    else if(f1&&!f2)
    {
        string c=a.substr(1,l1-1);
        if(MAX(c,b)>0)
        {
            putchar('-');
            bigsub(c,b);
        }
        else
            bigsub(b,c);
    }
    else
    {

        string d=b.substr(1,l2-1);
        if(MAX(d,a))
        {
            putchar('-');
            bigsub(d,a);
        }
        else
            bigsub(a,d);
    }
    return 0;
}

 

你可能感兴趣的:(51nod 1005大数相加(包含负数))