C++高精度结构体

简单介绍

这是一个使用起来很方便的高精度结构体,可以直接当 int 用,可以进行高精度之间的运算和高精度与单精度的运算,支持加减乘除以及取模,输入输出不用单独写 for 循环,平时练习可以复制,(但考场上你根本背不下的,放弃吧)

代码实现

含注释详解版(点击查看)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1005;  // 最大位数,可根据需要调整

struct big_int {
    int num[N];   // 倒序存储,num[1]为个位
    long long len;   // 当前长度(位数)

    // 构造函数:默认置零
    big_int(long long x = 0) {
        memset(num, 0, sizeof num);
        len = 0;
        if (x == 0) {
            len = 1;
            num[1] = 0;
            return;
        }
        while (x > 0) {
            num[++len] = x % 10;
            x /= 10;
        }
        if (len == 0) len = 1;  // 处理 x=0 的情况
    }

    // 从字符串构造(方便输入)
    big_int(const string& s) {
        memset(num, 0, sizeof num);
        len = s.size();
        for (int i = 0; i < len; i++)
            num[len - i] = s[i] - '0';  // 倒序存储
    }

    // 辅助函数:去除前导零并修正长度
    void trim() {
        while (len > 1 && num[len] == 0) len--;
        if (len == 0) { len = 1; num[1] = 0; }
    }

    // ---------- 比较运算符(用于除法和取模) ----------
    friend bool operator == (const big_int& a, const big_int& b) {
        if (a.len != b.len) return false;
        for (int i = 1; i <= a.len; i++)
            if (a.num[i] != b.num[i]) return false;
        return true;
    }

    friend bool operator < (const big_int& a, const big_int& b) {
        if (a.len != b.len) return a.len < b.len;
        for (int i = a.len; i >= 1; i--) {
            if (a.num[i] != b.num[i]) return a.num[i] < b.num[i];
        }
        return false; // 相等
    }

    friend bool operator > (const big_int& a, const big_int& b) { return b < a; }
    friend bool operator <= (const big_int& a, const big_int& b) { return !(a > b); }
    friend bool operator >= (const big_int& a, const big_int& b) { return !(a < b); }
    friend bool operator != (const big_int& a, const big_int& b) { return !(a == b); }

    // ---------- 加法 ----------
    // 高精 + 高精
    friend big_int operator + (const big_int& a, const big_int& b) {
        big_int res;
        res.len = max(a.len, b.len);
        int carry = 0;
        for (int i = 1; i <= res.len; i++) {
            int sum = a.num[i] + b.num[i] + carry;
            res.num[i] = sum % 10;
            carry = sum / 10;
        }
        if (carry) res.num[++res.len] = carry;
        res.trim();
        return res;
    }

    // 高精 + 单精(int)
    friend big_int operator + (const big_int& a, int b) {
        big_int bb(b);
        return a + bb;
    }
    friend big_int operator + (int a, const big_int& b) {
        return b + a;
    }

    // 复合赋值
    big_int& operator += (const big_int& other) {
        *this = *this + other;
        return *this;
    }
    big_int& operator += (int other) {
        *this = *this + other;
        return *this;
    }

    // ---------- 减法(保证 a >= b) ----------
    friend big_int operator-(const big_int& a, const big_int& b) {
        // 默认 a >= b,若小于则返回 0(或可抛出异常)
        if (a < b) return big_int(0);
        big_int res;
        res.len = a.len;
        int borrow = 0;
        for (int i = 1; i <= a.len; i++) {
            int diff = a.num[i] - b.num[i] - borrow;
            if (diff < 0) {
                diff += 10;
                borrow = 1;
            } else borrow = 0;
            res.num[i] = diff;
        }
        res.trim();
        return res;
    }

    friend big_int operator - (const big_int& a, int b) {
        big_int bb(b);
        return a - bb;
    }
    friend big_int operator - (int a, const big_int& b) {
        big_int aa(a);
        return aa - b;
    }

    big_int& operator -= (const big_int& other) {
        *this = *this - other;
        return *this;
    }
    big_int& operator -= (int other) {
        *this = *this - other;
        return *this;
    }

    // ---------- 乘法 ----------
    friend big_int operator*(const big_int& a, const big_int& b) {
        big_int res;
        res.len = a.len + b.len;
        for (int i = 1; i <= a.len; i++) {
            for (int j = 1; j <= b.len; j++) {
                res.num[i + j - 1] += a.num[i] * b.num[j];
                res.num[i + j] += res.num[i + j - 1] / 10;
                res.num[i + j - 1] %= 10;
            }
        }
        res.trim();
        return res;
    }

    friend big_int operator * (const big_int& a, int b) {
        big_int bb(b);
        return a * bb;
    }
    friend big_int operator * (int a, const big_int& b) {
        return b * a;
    }

    big_int& operator *= (const big_int& other) {
        *this = *this * other;
        return *this;
    }
    big_int& operator *= (int other) {
        *this = *this * other;
        return *this;
    }

    // ---------- 除法(高精 / 高精,向下取整) ----------
    friend big_int operator/(const big_int& a, const big_int& b) {
        if (b == big_int(0)) {
            cerr << "Error: Division by zero!" << "\n";
            return big_int(0);
        }
        if (a < b) return big_int(0);
        big_int res, rmdr;
        res.len = a.len;
        // 从高位到低位试商
        for (int i = a.len; i >= 1; i--) {
            // 将当前余数整体左移一位(乘以10)并加上当前位
            for (int j = rmdr.len; j >= 1; j--)
                rmdr.num[j + 1] = rmdr.num[j];
            rmdr.len++;
            rmdr.num[1] = a.num[i];
            rmdr.trim();

            // 二分查找商 q(0~9)
            int q = 0, l = 0, r = 9;
            while (l <= r) {
                int mid = (l + r) / 2;
                big_int tmp = b * mid;
                if (tmp <= rmdr) {
                    q = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            res.num[i] = q;
            // 更新余数:rmdr = rmdr - b * q
            big_int sub = b * q;
            rmdr = rmdr - sub;
        }
        res.trim();
        return res;
    }

    friend big_int operator / (const big_int& a, int b) {
        big_int bb(b);
        return a / bb;
    }
    friend big_int operator / (int a, const big_int& b) {
        big_int aa(a);
        return aa / b;
    }

    big_int& operator /= (const big_int& other) {
        *this = *this / other;
        return *this;
    }
    big_int& operator /= (int other) {
        *this = *this / other;
        return *this;
    }

    // ---------- 取模(高精 % 高精) ----------
    friend big_int operator % (const big_int& a, const big_int& b) {
        if (b == big_int(0)) {
            cerr << "Error: Modulo by zero!" << "\n";
            return big_int(0);
        }
        if (a < b) return a;
        // 利用除法:a % b = a - (a / b) * b
        big_int quotient = a / b;
        big_int product = quotient * b;
        return a - product;
    }

    friend big_int operator % (const big_int& a, int b) {
        big_int bb(b);
        return a % bb;
    }
    friend big_int operator % (int a, const big_int& b) {
        big_int aa(a);
        return aa % b;
    }

    big_int& operator %= (const big_int& other) {
        *this = *this % other;
        return *this;
    }
    big_int& operator %= (int other) {
        *this = *this % other;
        return *this;
    }

    // ---------- 输出流 ----------
    friend ostream& operator << (ostream& out, const big_int& x) {
        for (int i = x.len; i >= 1; i--)
            out << x.num[i];
        return out;
    }
};

// 示例使用
int main() {
    big_int a("12345678901234567890");
    big_int b("98765432109876543210");
    big_int c = a + b;
    cout << "a + b = " << c << "\n";

    big_int d = a * 12345;
    cout << "a * 12345 = " << d << "\n";

    big_int e = b / 3;
    cout << "b / 3 = " << e << "\n";

    big_int f = b % 100;
    cout << "b % 100 = " << f << "\n";

    return 0;
}

无注释版

Tips:无main函数。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1005;

struct big_int {
    int num[N];
    long long len;
    big_int(long long x = 0) {
        memset(num, 0, sizeof num);
        len = 0;
        if (x == 0) {
            len = 1; num[1] = 0;
            return;
        }
        while (x > 0) {
            num[++len] = x % 10; x /= 10;
        }
        if (len == 0) len = 1;
    }
    big_int(const string& s) {
        memset(num, 0, sizeof num);
        len = s.size();
        for (int i = 0; i < len; i++) num[len - i] = s[i] - '0';
    }
    void trim() {
        while (len > 1 && num[len] == 0) len--;
        if (len == 0) { len = 1; num[1] = 0; }
    }
    friend bool operator == (const big_int& a, const big_int& b) {
        if (a.len != b.len) return 0;
        for (int i = 1; i <= a.len; i++) if (a.num[i] != b.num[i]) return 0;
        return true;
    }
    friend bool operator < (const big_int& a, const big_int& b) {
        if (a.len != b.len) return a.len < b.len;
        for (int i = a.len; i >= 1; i--) {
            if (a.num[i] != b.num[i]) return a.num[i] < b.num[i];
        }
        return 0;
    }

    friend bool operator > (const big_int& a, const big_int& b) { return b < a; }
    friend bool operator <= (const big_int& a, const big_int& b) { return !(a > b); }
    friend bool operator >= (const big_int& a, const big_int& b) { return !(a < b); }
    friend bool operator != (const big_int& a, const big_int& b) { return !(a == b); }

    friend big_int operator + (const big_int& a, const big_int& b) {
        big_int res;
        res.len = max(a.len, b.len);
        int carry = 0;
        for (int i = 1; i <= res.len; i++) {
            int sum = a.num[i] + b.num[i] + carry;
            res.num[i] = sum % 10;
            carry = sum / 10;
        }
        if (carry) res.num[++res.len] = carry;
        res.trim();
        return res;
    }

    friend big_int operator + (const big_int& a, int b) {
        big_int bb(b);
        return a + bb;
    }
    friend big_int operator + (int a, const big_int& b) {
        return b + a;
    }

    big_int& operator += (const big_int& other) {
        *this = *this + other;
        return *this;
    }
    big_int& operator += (int other) {
        *this = *this + other;
        return *this;
    }

    friend big_int operator-(const big_int& a, const big_int& b) {
        if (a < b) return big_int(0);
        big_int res; res.len = a.len;
        int borrow = 0;
        for (int i = 1; i <= a.len; i++) {
            int diff = a.num[i] - b.num[i] - borrow;
            if (diff < 0) {
                diff += 10;
                borrow = 1;
            } else borrow = 0;
            res.num[i] = diff;
        }
        res.trim();
        return res;
    }

    friend big_int operator - (const big_int& a, int b) {
        big_int bb(b);
        return a - bb;
    }
    friend big_int operator - (int a, const big_int& b) {
        big_int aa(a);
        return aa - b;
    }

    big_int& operator -= (const big_int& other) {
        *this = *this - other;
        return *this;
    }
    big_int& operator -= (int other) {
        *this = *this - other;
        return *this;
    }

    friend big_int operator*(const big_int& a, const big_int& b) {
        big_int res;
        res.len = a.len + b.len;
        for (int i = 1; i <= a.len; i++) {
            for (int j = 1; j <= b.len; j++) {
                res.num[i + j - 1] += a.num[i] * b.num[j];
                res.num[i + j] += res.num[i + j - 1] / 10;
                res.num[i + j - 1] %= 10;
            }
        }
        res.trim();
        return res;
    }

    friend big_int operator * (const big_int& a, int b) {
        big_int bb(b);
        return a * bb;
    }
    friend big_int operator * (int a, const big_int& b) {
        return b * a;
    }

    big_int& operator *= (const big_int& other) {
        *this = *this * other;
        return *this;
    }
    big_int& operator *= (int other) {
        *this = *this * other;
        return *this;
    }

    friend big_int operator/(const big_int& a, const big_int& b) {
        if (b == big_int(0)) {
            cerr << "Error: Division by zero!" << "\n";
            return big_int(0);
        }
        if (a < b) return big_int(0);
        big_int res, rmdr;
        res.len = a.len;
        for (int i = a.len; i >= 1; i--) {
            for (int j = rmdr.len; j >= 1; j--)
                rmdr.num[j + 1] = rmdr.num[j];
            rmdr.len++; rmdr.num[1] = a.num[i]; rmdr.trim();
            int q = 0, l = 0, r = 9;
            while (l <= r) {
                int mid = (l + r) / 2;
                big_int tmp = b * mid;
                if (tmp <= rmdr) {
                    q = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            res.num[i] = q;
            big_int sub = b * q;
            rmdr = rmdr - sub;
        }
        res.trim();
        return res;
    }

    friend big_int operator / (const big_int& a, int b) {
        big_int bb(b);
        return a / bb;
    }
    friend big_int operator / (int a, const big_int& b) {
        big_int aa(a);
        return aa / b;
    }

    big_int& operator /= (const big_int& other) {
        *this = *this / other;
        return *this;
    }
    big_int& operator /= (int other) {
        *this = *this / other;
        return *this;
    }

    friend big_int operator % (const big_int& a, const big_int& b) {
        if (b == big_int(0)) {
            cerr << "Error: Modulo by zero!" << "\n";
            return big_int(0);
        }
        if (a < b) return a;
        return a - (a / b) * b;
    }

    friend big_int operator % (const big_int& a, int b) {
        big_int bb(b);
        return a % bb;
    }
    friend big_int operator % (int a, const big_int& b) {
        big_int aa(a);
        return aa % b;
    }

    big_int& operator %= (const big_int& other) {
        *this = *this % other;
        return *this;
    }
    big_int& operator %= (int other) {
        *this = *this % other;
        return *this;
    }

    friend ostream& operator << (ostream& out, const big_int& x) {
        for (int i = x.len; i >= 1; i--)
            out << x.num[i];
        return out;
    }
};
posted @ 2026-08-14 21:56  Void__114  阅读(16)  评论(0)    收藏  举报