跳转至

高精度(四):统一模板

使用范围

该模板处理非负高精度整数,支持:

  • 高精加高精
  • 高精减高精
  • 高精乘低精
  • 高精乘高精
  • 高精除低精
  • 高精除高精
  • 高精模高精

减法要求左边不小于右边,除数不能为 0

完整模板

#include <bits/stdc++.h>

using namespace std;

class BigInteger {

public:

    vector<int> a;


    BigInteger() {
        a.push_back(0);
    }


    BigInteger(int x) {
        if (x == 0)
            a.push_back(0);

        while (x) {
            a.push_back(x % 10);
            x /= 10;
        }
    }


    BigInteger(string s) {
        for (int i = s.size() - 1; i >= 0; i--)
            a.push_back(s[i] - '0');

        clear();
    }


    void clear() {
        while (a.size() > 1 && a.back() == 0)
            a.pop_back();
    }


    friend istream& operator >> (istream &in, BigInteger &A) {
        string s;

        in >> s;

        A.a.clear();

        for (int i = s.size() - 1; i >= 0; i--)
            A.a.push_back(s[i] - '0');

        A.clear();

        return in;
    }


    friend ostream& operator << (ostream &out, BigInteger A) {
        for (int i = A.a.size() - 1; i >= 0; i--)
            out << A.a[i];

        return out;
    }


    bool operator < (BigInteger B) const {
        if (a.size() != B.a.size())
            return a.size() < B.a.size();

        for (int i = a.size() - 1; i >= 0; i--)
            if (a[i] != B.a[i])
                return a[i] < B.a[i];

        return false;
    }


    bool operator == (BigInteger B) const {
        return a == B.a;
    }


    bool operator <= (BigInteger B) const {
        return *this < B || *this == B;
    }


    bool operator > (BigInteger B) const {
        return !(*this <= B);
    }


    bool operator >= (BigInteger B) const {
        return !(*this < B);
    }


    BigInteger operator + (BigInteger B) const {
        BigInteger C;

        C.a.clear();

        int t = 0;

        for (int i = 0; i < a.size() || i < B.a.size(); i++) {
            if (i < a.size()) t += a[i];
            if (i < B.a.size()) t += B.a[i];

            C.a.push_back(t % 10);
            t /= 10;
        }

        if (t) C.a.push_back(t);

        return C;
    }


    BigInteger operator - (BigInteger B) const {
        BigInteger C;

        C.a.clear();

        for (int i = 0, t = 0; i < a.size(); i++) {
            t = a[i] - t;

            if (i < B.a.size()) t -= B.a[i];

            C.a.push_back((t + 10) % 10);

            if (t < 0) t = 1;
            else t = 0;
        }

        C.clear();

        return C;
    }


    BigInteger operator * (int b) const {
        BigInteger C;

        C.a.clear();

        long long t = 0;

        for (int i = 0; i < a.size() || t; i++) {
            if (i < a.size()) t += 1LL * a[i] * b;

            C.a.push_back(t % 10);
            t /= 10;
        }

        C.clear();

        return C;
    }


    BigInteger operator * (BigInteger B) const {
        BigInteger C;

        C.a.assign(a.size() + B.a.size() + 1, 0);

        for (int i = 0; i < a.size(); i++)
            for (int j = 0; j < B.a.size(); j++)
                C.a[i + j] += a[i] * B.a[j];

        for (int i = 0; i + 1 < C.a.size(); i++) {
            C.a[i + 1] += C.a[i] / 10;
            C.a[i] %= 10;
        }

        C.clear();

        return C;
    }


    BigInteger operator / (int b) const {
        BigInteger C;

        C.a.assign(a.size(), 0);

        long long r = 0;

        for (int i = a.size() - 1; i >= 0; i--) {
            r = r * 10 + a[i];

            C.a[i] = r / b;
            r %= b;
        }

        C.clear();

        return C;
    }


    int operator % (int b) const {
        long long r = 0;

        for (int i = a.size() - 1; i >= 0; i--)
            r = (r * 10 + a[i]) % b;

        return r;
    }


    BigInteger operator / (BigInteger B) const {
        BigInteger C, R;

        C.a.assign(a.size(), 0);

        for (int i = a.size() - 1; i >= 0; i--) {
            R.a.insert(R.a.begin(), a[i]);
            R.clear();

            int l = 0, r = 9;

            while (l < r) {
                int mid = (l + r + 1) / 2;

                if (B * mid <= R)
                    l = mid;
                else
                    r = mid - 1;
            }

            C.a[i] = l;
            R = R - B * l;
        }

        C.clear();

        return C;
    }


    BigInteger operator % (BigInteger B) const {
        BigInteger R;

        for (int i = a.size() - 1; i >= 0; i--) {
            R.a.insert(R.a.begin(), a[i]);
            R.clear();

            int l = 0, r = 9;

            while (l < r) {
                int mid = (l + r + 1) / 2;

                if (B * mid <= R)
                    l = mid;
                else
                    r = mid - 1;
            }

            R = R - B * l;
        }

        R.clear();

        return R;
    }

};


int main() {
    BigInteger a, b;

    cin >> a >> b;

    cout << a + b << '\n';
    cout << a - b << '\n';
    cout << a * b << '\n';
    cout << a / b << '\n';
    cout << a % b << '\n';

    return 0;
}

使用说明

cout << a + b;
cout << a - b;
cout << a * b;
cout << a * 10;
cout << a / b;
cout << a / 10;
cout << a % b;
cout << a % 10;

总结

学习时先理解数组和 vector 写法。

比赛时根据题目需要,从统一模板中保留对应运算。