大数加法和大数减法

来源:互联网 发布:数据统计模型 编辑:程序博客网 时间:2024/04/28 05:15

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

#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);    }}



0 0