大数加法和大数减法

两个极大的数相加或相减。主要运用字符串进行计算。

#include<iostream>
#include<string>
using namespace std;
void reverse(string& input){
    int n=input.size();
    int i=0,j=n-1;
    while(i<j){
        swap(input[i++],input[j--]);
    }
    return;
}

string myplus(string a,string b){
    int alen=a.size(),blen=b.size();
    reverse(a);
    reverse(b);
    int up=0;
    int i=0,j=0;
    string res;
    while(i<alen&&j<blen){
        int aa=a[i]-'0',bb=b[j]-'0';
        res.push_back(char((aa+bb+up)%10+'0'));
        up=(aa+bb+up)/10;
        i++;
        j++;
    }
    while(i<alen){
        int aa=a[i]-'0';
        res.push_back(char((aa+up)%10+'0'));
        up=(aa+up)/10;
        i++;
    }
    while(j<blen){
        int bb=b[j]-'0';
        res.push_back(char((bb+up)%10+'0'));
        up=(bb+up)/10;
        j++;
    }
    if(up) res.push_back(char(up+'0'));
    reverse(res);
    int ii=0;
    while(ii<res.size()&&res[ii]=='0') ii++;

    return ii==res.size()?"0":res.substr(ii);
}

string mysub(string a,string b){

    string res;

    if(a[0]=='-'){
        string tmp=b;
        b=a;
        a=tmp;
    }
    int alen=a.size(),blen=b.size();
    int flag=0;
    if(alen<blen-1){
        reverse(a);
        reverse(b);
        string tmp=b;
        b=a+"-";
        a=tmp.substr(0,tmp.size()-1);
        alen=a.size();
        blen=b.size();
        flag=1;
    }else if(alen==blen-1){
        int i=0,j=1;
        int fflag=0;
        while(i<alen&&j<blen){
            while(a[i]==b[j]) {i++;j++;}
            if(a[i]<b[j]){
                fflag=1;
                break;
            }else{
                break;
            }
        }
        if(fflag){
            reverse(a);
            reverse(b);
            string tmp=b;
            b=a+"-";
            a=tmp.substr(0,tmp.size()-1);
            alen=a.size();
            blen=b.size();
            flag=1;
        }else{
            reverse(a);
            reverse(b);
        }

    }
    else{
        reverse(a);
        reverse(b);
    }
    int i=0,j=0;
    int borrow=0;
    while(i<alen&&b[j]!='-'){
        if(borrow==0){
            int aa=a[i]-'0',bb=b[j]-'0';
            if(aa>=bb){
                res.push_back(char(aa-bb+'0'));
            }else{
                borrow=1;
                res.push_back(char(aa+10-bb+'0'));
            }
        }else{
            int aa=a[i]-'0',bb=b[j]-'0';
            if(aa-1>= bb){
                borrow=0;
                res.push_back(char(aa-1-bb+'0'));
            }else{
                res.push_back(char(aa-1+10-bb+'0'));
            }
        }
        i++;j++;
    }
    while(i<alen){
        if(borrow==0){
            res.push_back(a[i]);
        }else{
            int aa=a[i]-'0';
            if(aa-1>=0){
                borrow=0;
                res.push_back(char(aa-1+'0'));
            }else{
                res.push_back(char(aa-1+10+'0'));
            }
        }
        i++;
    }
    if(flag==1){
        reverse(res);
        int ii=0;
        while(ii<res.size()&&res[ii]=='0') ii++;
        return ii==res.size()?"0":"-"+res.substr(ii);
    }
    else{
        reverse(res);
        int ii=0;
        while(ii<res.size()&&res[ii]=='0') ii++;
        return ii==res.size()?"0":res.substr(ii);
    }
}



int main(){
    string input1,input2;
    cin>>input1>>input2;
    if(input1[0]!='-'&&input2[0]!='-') cout<<myplus(input1,input2);
    else if(input1[0]=='-'&&input2[0]=='-') cout<<'-'<<myplus(input1.substr(1),input2.substr(1));
    else{
        cout<<mysub(input1,input2);
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值