加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

51nod-1005 大数加法

发布时间:2020-12-14 02:53:55 所属栏目:大数据 来源:网络整理
导读:给出2个大整数A,B,计算A+B的结果。 Input 第1行:大数A第2行:大数B(A,B的长度?=?10000?需注意:A?B有可能为负数) Output 输出A?+?B Input 示例 68932147586468711654886 Output 示例 537643802472 http://www.51nod.com/onlineJudge/questionCode.html#!p

给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度?<=?10000?需注意:A?B有可能为负数)
Output
输出A?+?B
Input 示例
68932147586
468711654886
Output 示例
537643802472

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

纯粹的模拟题,就是A和B都有可能会负数,处理有点麻烦。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10010;
char a[maxn],b[maxn];
int aa[maxn],bb[maxn];
int main()
{
   // freopen("a.txt","r",stdin);
    while(scanf("%s%s",a,b)!=EOF)
    {
        memset(aa,sizeof(aa));
        memset(bb,sizeof(bb));
        int l1=strlen(a),l2=strlen(b),i;
        int flag1=0,flag2=0;
        if(a[0]=='0'&&b[0]=='0') printf("0n"); //特殊考虑a和b都为0的情况
        else
        {
            if(a[0]=='-')
            {
                flag1=1;  //判断 a是否是负数 是的话置标记
                for(i=0;i<l1-1;i++) //然后 a[0]是负号可以不用处理
                {
                aa[i]=a[l1-i-1]-'0';
                }
            }
            else  //否则  直接转换就好
            {
                 for(i=0;i<l1;i++)
                 {
                    aa[i]=a[l1-i-1]-'0';
                 }
            }
            if(b[0]=='-') //同理判断  b
            {
                flag2=1;
                for(i=0;i<l2-1;i++)
                {
                    bb[i]=b[l2-i-1]-'0';
                }
            }
            else
            {
                 for(i=0;i<l2;i++)
                 {
                    bb[i]=b[l2-i-1]-'0';
                 }
            }
            int s=0,ans=0;    //分四种情况  分别对a,b进行处理
            if(!flag1&&!flag2)   //a,b都为正数
            {
                l1=max(l1,l2);
                for(i=0;i<l1;i++)
                {
                    bb[i]+=aa[i];
                    if(bb[i]>=10) {  bb[i]-=10; bb[i+1]++; }
                }
                while(!bb[l1]) l1--;
                for(;l1>=0;l1--) printf("%d",bb[l1]);
                printf("n");
            }
            else if(!flag1&&flag2) //a为正数,b为负数
            {    //判断a,b的绝对值谁大谁小
                if(l1+1>l2) ans=1; //先判断长度
                else if(l1+1==l2) //长度相等,判断每一位的大小
                {
                    for(i=l1-1;i>=0;i--)
                    {
                        if(aa[i]>bb[i]) { ans=1;break;} //当前位大于  则a>b
                        else if(aa[i]<bb[i]) break; //否则小于
                    }
                }
                if(ans)  //a的绝对值大于b  例如332  -3  或者 332  -331
                {
                    for(i=0;i<l1;i++) //只要循环到l1-1即可
                    {
                        aa[i]-=bb[i];
                        if(aa[i]<0)
                        {
                            aa[i]+=10;
                            aa[i+1]--;
                        }
                    }
                    while(!aa[l1]) l1--;
                    for(;l1>=0;l1--) printf("%d",aa[l1]);
                    printf("n");
                }
                else //a的绝对值小于b
                {
                    for(i=0;i<l2-1;i++) //循环到 l2-2 ,因为b是负数
                    {
                        bb[i]-=aa[i];
                        if(bb[i]<0)
                        {
                            bb[i]+=10;
                            bb[i+1]--;
                        }
                    }
                    while(!bb[l2]) l2--;  //如果此时 bb变成0,比如 333  -333的情况
                    if(l2<0) printf("0n"); //输出0
                    else
                    {
                        printf("-"); //输出负号
                        for(;l2>=0;l2--) printf("%d",bb[l2]);
                        printf("n");
                    }
                }
            }
            else if(flag1&&!flag2) //和上面同理
            {
                if(l2+1>l1) ans=1;
                else if(l2+1==l1)
                {
                    for(i=l2-1;i>=0;i--)
                    {
                        if(bb[i]>aa[i]) { ans=1;break;}
                        else if(bb[i]<aa[i])break;
                    }
                }
                if(ans)
                {
                    for(i=0;i<l2;i++)
                    {
                        bb[i]-=aa[i];
                        if(bb[i]<0)
                        {
                            bb[i]+=10;
                            bb[i+1]--;
                        }
                    }
                    while(!bb[l2]) l2--;
                    for(;l2>=0;l2--) printf("%d",bb[l2]);
                    printf("n");
                }
                else
                {
                    for(i=0;i<l1-1;i++)
                    {
                        aa[i]-=bb[i];
                        if(aa[i]<0)
                        {
                            aa[i]+=10;
                            aa[i+1]--;
                        }
                    }
                    while(!aa[l1]) l1--;
                    if(l1<0) printf("0n");
                    else
                    {
                        printf("-");
                        for(;l1>=0;l1--) printf("%d",aa[l1]);
                        printf("n");
                    }
                }
            }
            else if(flag1&&flag2) //同为负数
            {
                printf("-");
                l1=max(l1,l2);
                for(i=0;i<l1-1;i++)
                {
                    bb[i]+=aa[i];
                    s=bb[i]/10;
                    bb[i]%=10;
                    bb[i+1]+=s;
                }
                while(!bb[l1]) l1--;
                for(;l1>=0;l1--) printf("%d",bb[l1]);
                printf("n");
            }
        }
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读