跳转至

高精度(三):类封装

前置知识

vector,类,运算符重载

目标

把高精度数字和运算封装到 BigInteger 类中。

BigInteger a, b;

cin >> a >> b;

cout << a + b;

类结构

class BigInteger {

public:

    vector<int> a;

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

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

高精加高精

BigInteger operator + (BigInteger B) {
    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;
}

高精减高精

要求当前数字不小于 B

BigInteger operator - (BigInteger B) {
    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) {
    BigInteger C;

    C.a.clear();

    int t = 0;

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

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

    C.clear();

    return C;
}

高精乘高精

BigInteger operator * (BigInteger B) {
    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) {
    BigInteger C;

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

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

高精除高精

BigInteger operator / (BigInteger B) {
    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();

        while (!(R < B)) {
            R = R - B;
            C.a[i]++;
        }
    }

    C.clear();

    return C;
}

总结

类封装以后,可以直接使用:

a + b
a - b
a * b
a / b