【算法模版】 高精度计算

259 阅读1分钟

简介

高精度计算也是常见典型例题之一,其解题思路概括来说就是按位来进行加减乘除,将大数拆解为数组来处理。现依次给出高精度加法高精度减法高进度乘法高精度除法的算法模版。

1 高精度加法

vector<int> BigAdd(const vector<int>& num1, const vector<int>& num2)
{   // num1,num2倒序存数据,eg.原数据为123,num1为{3, 2, 1}
    vector<int> sum;
    int add = 0;    // 存放进位
    int maxSize = max(num1.size(), num2.size());
    for (int i = 0; i < maxSize || add; i++) {
        if (i < num1.size()) {
            add += num1[i];
        }
        if (i < num2.size()) {
            add += num2[i];
        }
        sum.push_back(add % 10);
        add /= 10;
    }
    return sum;
}

题目: 高精度加法

2 高精度减法

vector<int> BigMinus(const vector<int>& num1, const vector<int>& num2)
{
    // 倒序存数据,个位数在首位
    vector<int> minus;
    int m = 0;
    for (int i = 0; i < num1.size(); i++) {
        m = num1[i] - m;
        if (i < num2.size()) {
            m -= num2[i];
        }
        minus.push_back((m + 10) % 10); // 这一步操作有点东西
        if (m < 0) {
            m = 1;
        } else {
            m = 0;
        }
    }
    // 去除前导0
    while (minus.size() > 1 && minus.back() == 0) {
        minus.pop_back();
    }
    return minus;
}

高精度乘法

vector<int> BigMulti(const vector<int>& num1, const vector<int>& num2)
{
    vector<int> multi(num1.size() + num2.size(), 0);
    for (int i = 0; i < num1.size(); i++) {
        for (int j = 0; j < num2.size(); j++) {
            multi[i + j] += num1[i] * num2[j];
        }
    }
    int n = 0;
    for (int i = 0; i < multi.size(); i++) {
        n += multi[i];
        multi[i] = n % 10;
        n /= 10;
    }
    // 去除前导0
    while (multi.size() > 1 && multi.back() == 0) {
        multi.pop_back();
    }
    return multi;
}

题目 高精度乘法