大数加减法(不用jave)

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

坑人!坑人!坑人!ヾ(≧へ≦)〃

我的大体框架分为两种:1.同号的情况(+ +与- -),其实质上就是相加,--只不过多个负号;2.异号的情况(+ -与- +),这里就比较麻烦了,还要判断长短以及大数的第一个数的大小。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 10005
char a[N],b[N];
int s1[N],s2[N],s3[N],s4[N];
int main()
{
    int len1,len2,i,j,flag1,flag2,k,max;
    while(scanf("%s%s",a,b)!=EOF)
    {
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        memset(s3,0,sizeof(s3));
        memset(s4,0,sizeof(s4));
        len1=strlen(a);
        len2=strlen(b);
        flag1=0;
        flag2=0;
        if(a[0]=='-')
        {
             flag1=1;
             len1--;          //如果含负号,长度减一,即减去-的长度//
        }
        if(b[0]=='-')
        {
            flag2=1;
            len2--;
        }
        if(flag1==0&&flag2==0)
        {
             for(i=0,j=len1-1;i<len1;i++,j--)
               s1[i]=a[j]-'0';
             for(i=0,j=len2-1;i<len2;i++,j--)     //当a,b为+ +情况,存入s1数组情况//
               s2[i]=b[j]-'0';
        }
        else if(flag1==1&&flag2==1)
        {
            for(i=0,j=len1;i<len1;i++,j--)
                s1[i]=a[j]-'0';
            for(i=0,j=len2;i<len2;i++,j--)    //当a,b为- -情况//
                s2[i]=b[j]-'0';
        }
        else if(flag1==0&&flag2==1)
        {
            for(i=0,j=len1-1;i<len1;i++,j--)  //a,b + -情况//
                s1[i]=a[j]-'0';
            for(i=0,j=len2;i<len2;i++,j--)
                s2[i]=b[j]-'0';
        }
        else if(flag1==1&&flag2==0)
        {
            for(i=0,j=len1;i<len1;i++,j--)    //a,b - +情况//
                s1[i]=a[j]-'0';
            for(i=0,j=len2-1;i<len2;i++,j--)
                s2[i]=b[j]-'0';
        }
         max=len1>len2?len1:len2;         //判断最大长度//
        k=0;
        if(flag1==flag2)                     //同号的情况//
        {
            for(i=0;i<max;i++)
            {
                s3[i]=(s1[i]+s2[i]+k)%10;
                k=(s1[i]+s2[i]+k)/10;
            }
            if(flag1==1&&flag2==1)
                printf("-");
            if(k!=0)
                printf("1");
            for(i=max-1;i>=0;i--)
            printf("%d",s3[i]);
            printf("\n");
        }
        else                                        //异号的情况//
        {           
            for(i=0;i<max;i++)                      
            {
                if(max==1&&s1[0]<s2[0])
                 s4[i]=s2[i]-s1[i];            //当只有一个数异号的时候,比如4,-9//
                else
                {
                   if(flag1==1&&flag2==0)       //当- +情况的时候//
                   {
                       if(len1>len2)
                        s4[i]=s1[i]-s2[i];               //哪个长度大,以哪个放在前面减去后面的//
                       else if(len1==len2&&s1[len1-1]>s2[len2-1])
                       s4[i]=s1[i]-s2[i];                          //长度相等时比较第一个数字大小//
                       else if(len1==len2&&s1[len1-1]<s2[len2-1])
                        s4[i]=s2[i]-s1[i];
                       else
                        s4[i]=s2[i]-s1[i];
                   }
                   else if(flag1==0&&flag2==1)     //当+ -情况的时候//
                   {
                       if(len1>len2)
                        s4[i]=s1[i]-s2[i];
                       else if(len1==len2&&s1[len1-1]>s2[len2-1])
                        s4[i]=s1[i]-s2[i];
                        else if(len1==len2&&s1[len1-1]<s2[len2-1])
                        s4[i]=s2[i]-s1[i];
                        else
                        s4[i]=s2[i]-s1[i];
                   }
                }

            }
                for(i=0;i<max;i++)
               {
                    if(s4[i]<0)
                    {
                        while(s4[i]<0)                
                        {
                          s4[i+1]=s4[i+1]-1;
                          s4[i]=s4[i]+10;
                        }
                    }
               }
               if(len1>len2&&flag1==1)          
               printf("-");
               else if(len1<len2&&flag2==1)
               printf("-");
               else if(len1==len2&&s1[max-1]>s2[max-1]&&flag1==1)
               printf("-");
               else if(len1==len2&&s1[max-1]<s2[max-1]&&flag2==1)
               printf("-");
               while(s4[max-1]==0)     //除去多余的0,比如你可能会输出0000009这种情况,我们需要去掉多余的0,直接输出9//
               {
                   if(s4[max-1]==0) 
                    max--;
               }
                for(i=max-1;i>=0;i--)
                    printf("%d",s4[i]);
                printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/narzisen/article/details/80285725