手写 C++ 高精度

· · 算法·理论

代码

namespace BigInt {
    using namespace std;
    class INT {
    private:
        int a[10005]; // 倒序高精度数组
        int len; // 高精数字位数(长度)
        bool f = false; // 负数标记(0 为正,1 为负)
        void copy(int a[]) { // 将倒序数组 a 正序存储到正序数组 n 中
            memset(n, 0, sizeof n);
            for (int lena = len, lenn = 1; lena >= 1; lena--, lenn++)
                n[lenn] = a[lena];
        }
    public:
        int n[10005]; // 正序高精度数组
        friend INT Iabs(INT a);
        INT(long long x = 0) { // 构造函数(整型转高精)
            f = false;
            if (x < 0) f = true, x = -x;
            memset(a, 0, sizeof a);
            if (x == 0) {
                len = 1;
            } else {
                for (len = 1; x; len++) a[len] = x % 10, x /= 10;
                len--;
            }
            copy(a);
        }
        INT(string s) { // 构造函数(字符串转高精)
            f = false;
            if (s[0] == '-') f = true, s.erase(0, 1);
            memset(a, 0, sizeof a);
            if (s.empty()) {
                len = 1;
            } else {
                for (len = 1; !s.empty(); len++) {
                    a[len] = s[s.size() - 1] - '0';
                    s.erase(s.size() - 1, 1);
                }
                len--;
            }
            copy(a);
        }
        inline int size() { return len; } // 获取数字位数
        bool operator >(INT b) { // 大于号重载
            if (f && !b.f) return false;
            if (!f && b.f) return true;
            if (!f) {
                if (len != b.len) return len > b.len;
                for (int i = len; i >= 1; i--)
                    if (a[i] != b.a[i])
                        return a[i] > b.a[i];
                return false;
            } else {
                INT a = Iabs(*this);
                b = Iabs(b);
                if (a.len != b.len) return a.len < b.len;
                for (int i = a.len; i >= 1; i--)
                    if (a.a[i] != b.a[i])
                        return a.a[i] < b.a[i];
                return false;
            }
        }
        bool operator ==(INT b) { // 等于号重载
            if ((f && !b.f) || (!f && b.f) || len != b.len)
                return false;
            for (int i = 1; i <= len; i++)
                if (a[i] != b.a[i])
                    return false;
            return true;
        }
        bool operator <(INT b) { return !(*this > b) && !(*this == b); } // 小于号重载
        bool operator >=(INT b) { return (*this > b) || (*this == b); } // 大于等于重载
        bool operator <=(INT b) { return (*this < b) || (*this == b); } // 小于等于重载
        bool operator !=(INT b) { return !(*this == b); } // 不等于重载
        INT operator -() { // 负号重载
            INT b = *this;
            b.f = !b.f;
            return b;
        }
        INT operator +(INT b) { // 高精度加法
            INT a = *this, c;
            if (a.f == b.f) {
                c.f = a.f, a = Iabs(a), b = Iabs(b);
            } else {
                if (Iabs(a) > Iabs(b)) c = Iabs(a) - Iabs(b), c.f = a.f;
                else if (Iabs(b) > Iabs(a)) c = Iabs(b) - Iabs(a), c.f = b.f;
                else return 0;
                return c;
            }
            c.len = max(a.len, b.len) + 1;
            for (int i = 1; i <= c.len; i++) c.a[i] = a.a[i] + b.a[i];
            for (int i = 1; i <= c.len; i++)
                if (c.a[i] >= 10)
                    c.a[i + 1]++, c.a[i] -= 10;
            while (!c.a[c.len] && c.len > 1) c.len--;
            c.copy(c.a);
            return c;
        }
        INT operator -(INT b) { // 高精度减法
            INT a = *this, c;
            if (a.f == true || b.f == true) return c = a + (-b);
            if (a < b) {
                INT t = a;
                a = b, b = t, c.f = true;
            }
            c.len = max(a.len, b.len);
            for (int i = 1; i <= c.len; i++) c.a[i] = a.a[i] - b.a[i];
            for (int i = 1; i <= c.len; i++)
                if (c.a[i] < 0)
                    c.a[i + 1]--, c.a[i] += 10;
            while (!c.a[c.len] && c.len > 1) c.len--;
            c.copy(c.a);
            return c;
        }
        INT operator *(INT b) { // 高精度乘法
            INT a = *this, c;
            a = Iabs(a), b = Iabs(b);
            if (a.f != b.f) c.f = true;
            c.len = a.len + b.len;
            for (int i = 1; i <= a.len; i++)
                for (int j = 1; j <= b.len; j++)
                    c.a[i + j - 1] += a.a[i] * b.a[j];
            for (int i = 1; i <= c.len; i++)
                if (c.a[i] >= 10)
                    c.a[i + 1] += c.a[i] / 10, c.a[i] %= 10;
            while (!c.a[c.len] && c.len > 1) c.len--;
            c.copy(c.a);
            return c;
        }
        INT operator /(int b) { // 高精度除法
            INT a = *this, c;
            if (a.f) c.f = b > 0;
            else c.f = b < 0;
            a = Iabs(a), b = abs(b);
            int x = 0;
            for (int i = a.len; i >= 1; i--) {
                int cur = x * 10 + a.a[i];
                c.a[i] = cur / b;
                x = cur % b;
            }
            c.len = a.len;
            while (c.len > 1 && c.a[c.len] == 0) c.len--;
            c.copy(c.a);
            return c;
        }
        int operator %(int b) { // 取余
            INT a = *this;
            int x = 0, f = (a.f ? -1 : 1);
            a = Iabs(a), b = abs(b);
            for (int i = len; i >= 1; i--)
                x = (x * 10 + a.a[i]) % b;
            return x * f;
        }
        void operator +=(INT b) { *this = *this + b; }
        void operator -=(INT b) { *this = *this - b; }
        void operator *=(INT b) { *this = *this * b; }
        void operator /=(int b) { *this = *this / b; }
        void operator %=(int b) { *this = *this % b; }
        void operator ++() { *this += 1; }
        void operator --() { *this -= 1; }
        void read() { // 读入字符串为高精数字
            string s;
            cin >> s;
            *this = INT(s);
        }
        void print() { // 输出高精数字
            if (f && n[1] != 0) printf("-");
            for (int i = 1; i <= len; i++) printf("%d", n[i]);
        }
    };
    struct INTgreater { // 倒序排序规则
        bool operator ()(INT a, INT b) { return a > b; }
    };
    int INTcint(INT a) {
        int res = 0;
        for (int i = 1; i <= a.size(); i++)
            res = res * 10 + a.n[i];
        if (a < 0) res = -res;
        return res;
    }
    INT Iabs(INT a) { return (a < 0 ? -a : a); } // 绝对值
    INT INTpower(INT a, INT b) { // 幂运算
        INT ans = 1;
        while (b != 0) {
            if (b % 2 == 1) ans = ans * a;
            b = b / 2;
            a = a * a;
        }
        return ans;
    }
}