高精度加减乘除

基本操作

字符串存vector:
for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
去前导零:(除了加法,其他三种操作都需要去除前导零)
while(C.size() > 1 && C.back() == 0) C.pop_back();

加法

注意点:
1.如果数字B比数字A长,怎么处理?
2.处理完了数字长度短一点的B,该怎么做?
3.最高位还有没有进位?
核心思想:用一个进位t存储进位t、A[i]、B[i]的和,再将进位处理之后存入C。

vector<int> add(vector<int> &A, vector<int> &B) {
    
    if(A.size() < B.size()) return add(B, A);
    
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size(); i ++) {
        t += A[i];
        if(i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    
    if(t) C.push_back(t);
    return C;
    
}

减法

注意点:
1.处理完了数字长度短一点的B,该怎么做?
2.注意存数字C时t的处理方式。
3.借位在最后怎么表示?
核心思想:t是借位也是A-B的结果。

vector<int> sub(vector<int> &A, vector<int> &B) {
    vector<int> C;
    int t = 0;
    for(int i = 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.back() == 0 && C.size() > 1) C.pop_back();
    return C;
}

此外,减法操作需要一个cmp函数,对比数字A是否大于等于B:

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

乘法

注意点:
1.因为t是乘出来的,所以值可能会是一个比较大的数,在A最高位处理完之后,怎么处理进位t多出来的数?
2.在A最高位处理完后,怎么处理A?
核心思想:很像加法,用t存A[i]*b,再处理t即可。

vector<int> mul(vector<int> A, int b) {
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size() || t; i ++) {
        if(i < A.size()) {
            t += A[i] * b;
        }
        C.push_back(t % 10);
        t /= 10;
    }
    while(C.back() == 0 && C.size() > 1) C.pop_back();
    return C;
}

除法

注意点:
1.除法多个余数r。
2.reverse转置C,即注意C的存储方式,要按照加减乘中来,以便统一。
3.r/b而不是r/10,r %= b而不是r %= 10。
核心思想:上一轮的余数乘10加上本轮的个位数去除被除数,并将结果存到C中。

vector<int> div(vector<int> &A, int b, int &r) {
    vector<int> C;
    int t = 0;
    
    for(int i = A.size() - 1; i >= 0; i --) {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    
    while(C.back() == 0 && C.size() > 1) {
        C.pop_back();
    }
    return C;
}
posted @ 2022-10-10 16:42  wushucan  阅读(12)  评论(0)    收藏  举报