大數模板(c++)版

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//一個大整數一個整數的除法,和餘數;
vector<int> div(vector<int> &A, int b, int &r){
    vector<int> c;
    //int tmp = 0;
    r = 0;
    for(int i = 0; i < A.size(); i++){
        r = r * 10 + A[i];
        c.push_back(r / b);
        r = r % b;
    }
    reverse(c.begin(),c.end());
    while(c.size() > 1 && c.back() == 0) c.pop_back();
    return c;
}
//一個大整數,一個整數的乘法
vector<int> muti(vector<int>A, int b){
    vector<int> c;
    int tmp = 0;
    for(int i = 0; i < A.size(); i++){
        tmp += A[i] * b;
        c.push_back(tmp % 10);
        tmp /= 10;
    }
    while(tmp){
        c.push_back(tmp % 10);
        tmp /= 10;
    }
    return c;
}
//兩個大整數
vector<int> muti1(vector<int> &A, vector<int> &B){
    vector<int> c(A.size() + B.size());
    for(int i = 0; i < A.size(); i++){
        for(int j = 0; j < B.size(); j++){
            c[i + j + 1] += A[i] * B[j];
        }
    }
    for(int i = A.size() + B.size() - 1; i > 0; i--){
        if(c[i] >= 10){
            c[i - 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    return c;
//注意有可能有前導0;
}

//大數減法;
bool cmp(vector<int> &A, vector<int> &B){
    if(A.size() != B.size()) return A.size() > B.size();
    for(int i = A.size() - 1; i >= 0; i--){
        if(A[i] != B[i]) return A[i] > B[i];
    }
    return true;
}
vector<int> sub(vector<int> &A, vector<int> &B){
    if(cmp(A,B)){
        vector<int>c;
        int tmp = 0;
        for(int i = 0; i < A.size(); i++){
            tmp += A[i];
            if(i < B.size()) tmp -= B[i];
            c.push_back((tmp + 10)%10);
            //tmp /= 10;
            if(tmp < 0)tmp = -1;
            else tmp = 0;
        }
        while(c.size() > 1 && c.back() == 0) c.pop_back();
        return c;
    }
    else {
            cout<<"-";
            return sub(B,A);
        }
}
//大數加法
vector<int> add(vector<int> &A, vector<int> &B){
    if(A.size() < B.size()) return add(B,A);
    int tmp = 0;
    vector<int>c;
    for(int i = 0; i < A.size(); i++){
        tmp += A[i];
        if(i < B.size())tmp += B[i];
        c.push_back(tmp%10);
        if(tmp >= 10) tmp = 1;
        else tmp = 0;
    }
    if(tmp)c.push_back(tmp);
    return c;
}
int main()
{
    string a,b;
    //int b,r = 0;
    cin>>a>>b;
    vector<int>A,B,C;
    for(int i = a.length() - 1; i >= 0; i--)A.push_back(a[i] - '0');
    for(int i = b.length() - 1; i >= 0; i--)B.push_back(b[i] - '0');
    //C = div(A,b,r);
    C = add(A,B);
    for(int i = C.size() - 1; i >= 0; i--)cout<<C[i];
    cout<<endl;
    //cout<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章