51Nod-1005 大数加法

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

没有一发TLE,AC了,好开心~~

分析:思路还是很清晰的,就是代码写的有点长,可以改进,改进需要注意的点太多,遂放弃、、

分为两种情况,s1,s2同号或者异号,两种情况都要对s1,s2进行处理,进行移位操作,末位存在Max_n-1位置,(去掉负号后的)首位存在v,方便计算。s1,s2同号时很好计算啦,异号时,交换s1,s2,使得s1总为正的,再对s1,s2相对绝对值的大小进行讨论即可!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max_n=11000;
bool f1=0,f2=0;//f1,f2分别记录了s1,s2的正负
int len1,len2,v1=Max_n,v2=Max_n;//v1,v2记录了s1,s2首位的位置(去掉负号后的)
char s1[Max_n],s2[Max_n];
void Add(){
    if(f1&&f2){//s1,s2全为负
        for(int i=len1-1;i>=1;i--){//s1末位存在Max_n-1位置,首位存在v1(下同)
            s1[--v1]=s1[i];
            s1[i]='0';
        }
        for(int i=len2-1;i>=1;i--){//s2末位存在Max_n-1位置,首位存在v2(下同)
            s2[--v2]=s2[i];
            s2[i]='0';
        }
        int v=min(v1,v2);
        for(int i=Max_n-1;i>=v;i--){
            s1[i]=s2[i]+s1[i]-'0';
            if(s1[i]>'9'){s1[i]-=10;s1[i-1]++;}
        }
        if(s1[v-1]=='1')v--;//进位处理
        printf("-");
        for(int i=v;i<Max_n;i++)
            printf("%c",s1[i]);
        printf("\n");
    }
    else {//s1,s2全为正
        for(int i=len1-1;i>=0;i--){
            s1[--v1]=s1[i];
            s1[i]='0';
        }
        for(int i=len2-1;i>=0;i--){
            s2[--v2]=s2[i];
            s2[i]='0';
        }
        int v=min(v1,v2);
        for(int i=Max_n-1;i>=v;i--){
            s1[i]=s2[i]+s1[i]-'0';
            if(s1[i]>'9'){s1[i]-=10;s1[i-1]++;}
        }
        if(s1[v-1]=='1')v--;//进位处理
        for(int i=v;i<Max_n;i++)
            printf("%c",s1[i]);
        printf("\n");
    }
}
void Sub(){
    if(f1){swap(s1,s2);swap(len1,len2);} //令s1为正,方便处理
    int f=1;//判断s1,s2的绝对值大小
    if(len1>=len2)f=1;
    else if(len1<len2-1)f=0;
    else {
        for(int i=0;i<len1;i++){
            if(s1[i]>s2[i+1]){f=1;break;}
            if(s1[i]<s2[i+1]){f=0;break;}
        }
    }
    //cout<<f<<endl;
    if(f==1){  //s1的绝对值大于s2
        for(int i=len1-1;i>=0;i--){
            s1[--v1]=s1[i];
            s1[i]='0';
        }
        for(int i=len2-1;i>=1;i--){
            s2[--v2]=s2[i];
            s2[i]='0';
        }
        int v=min(v1,v2);
        for(int i=Max_n-1;i>=v;i--){
            s1[i]=s1[i]-s2[i]+'0';
            if(s1[i]<'0'){s1[i]+=10;s1[i-1]--;}
        }
        while(s1[v]=='0')v++;//退位处理
        for(int i=v;i<Max_n;i++)
            printf("%c",s1[i]);
        printf("\n");
    }
    else {//s1的绝对值小于s2
        for(int i=len1-1;i>=0;i--){
            s1[--v1]=s1[i];
            s1[i]='0';
        }
        for(int i=len2-1;i>=1;i--){
            s2[--v2]=s2[i];
            s2[i]='0';
        }
        int v=min(v1,v2);
        for(int i=Max_n-1;i>=v;i--){
            s2[i]=s2[i]-s1[i]+'0';
            if(s2[i]<'0'){s2[i]+=10;s2[i-1]--;}
        }
        while(s2[v]=='0')v++;//退位处理
        printf("-");
        for(int i=v;i<Max_n;i++)
            printf("%c",s2[i]);
        printf("\n");
    }
}
int main()
{
   for(int i=0;i<Max_n;i++)s1[i]=s2[i]='0';
    scanf("%s%s",s1,s2);
    len1=strlen(s1),len2=strlen(s2);
    if(s1[0]=='-')f1=1;
    if(s2[0]=='-')f2=1;
    if((f1&&f2)||(!f1&&!f2))
        Add();  //同为正负操作
    else Sub(); //异号操作
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值