高精度加法

#include <cmath>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
bool cmp(string &s, string &t){
    if(s.size()!=t.size())return s.size()>t.size();
    for(int i=0;i<s.size();i++){
        if(s[i]!=t[i])
            return s[i]>t[i];
    }
    return true;
}
vector<int> sub(string &s, string &t){
    vector<int>c;
    vector<int>a,b;
    for(int i=s.size()-1;i>=0;i--)a.push_back(s[i]-'0');
    for(int i=t.size()-1;i>=0;i--)b.push_back(t[i]-'0');
    for(int i=0,t=0;i<a.size();i++){
        t=a[i]-t;
        if(i<b.size())t-=b[i];
        c.push_back((t+10)%10);
        if(t<0)t=1;
        else t=0;
    }
    while(c.size()>1&&c.back()==0)c.pop_back();
    return c;
}
vector<int> add(string &s, string &t){
    vector<int>a,b;
    for(int i=s.size()-1;i>=0;i--)a.push_back(s[i]-'0');
    for(int i=t.size()-1;i>=0;i--)b.push_back(t[i]-'0');
    vector<int>c;
    int k=0;
    for(int i=0;i<a.size()||i<b.size();i++){
        if(i<a.size())k+=a[i];
        if(i<b.size())k+=b[i];
        c.push_back(k%10);
        k/=10;
    }
    if(k)c.push_back(1);
    return c;
}
int main() { 
    string s, t;
    cin>>s>>t;
    if(s.size()<=10001||t.size()<=10001){
            if(s[0]!='-'&&t[0]!='-'){
            auto res=add(s,t);
            for(int i=res.size()-1;i>=0;i--)
                cout<<res[i];
            cout<<endl;
        }else if(s[0]=='-'&&t[0]=='-'){
            s=s.substr(1),t=t.substr(1);
            auto res=add(s,t);
            cout<<'-';
            for(int i=res.size()-1;i>=0;i--)
                cout<<res[i];
            cout<<endl;
        }else if(s[0]=='-'&&t[0]!='-'){
            s=s.substr(1);
            if(cmp(s,t)){
                cout<<'-';
                auto res=sub(s,t);
                for(int i=res.size()-1;i>=0;i--)
                    cout<<res[i];
                cout<<endl;
            }else{
                auto res=sub(t,s);
                for(int i=res.size()-1;i>=0;i--)
                    cout<<res[i];
                cout<<endl;
            }
        }else if(s[0]!='-'&&t[0]=='-'){
            t=t.substr(1);
            if(cmp(s,t)){
                auto res=sub(s,t);
                for(int i=res.size()-1;i>=0;i--)
                    cout<<res[i];
                cout<<endl;
            }else{
                cout<<'-';
                auto res=sub(t,s);
                for(int i=res.size()-1;i>=0;i--)
                    cout<<res[i];
                cout<<endl;
            }
        }else if(s[0]=='0'&&t[0]=='0'){
            cout<<'0'<<endl;
        }

    }
    return 0;
}

 

posted @ 2019-07-19 19:45  YF-1994  阅读(120)  评论(0编辑  收藏  举报