大整数基本全部类型

class bint {
    vector<int> arr;  // 存储数字,低位在前
    int sign;         // 符号位:1 表示正数,-1 表示负数

    // 大整数加法
    vector<int> add(const vector<int>& a, const vector<int>& b) const {
        vector<int> c(max(a.size(), b.size()) + 1, 0);
        for (size_t i = 0; i < c.size() - 1; ++i) {
            if (i < a.size()) c[i] += a[i];
            if (i < b.size()) c[i] += b[i];
            if (c[i] >= 10) {
                c[i] -= 10;
                c[i + 1] += 1;
            }
        }
        while (c.size() > 1 && c.back() == 0) c.pop_back();
        return c;
    }

    // 大整数减法(假定 |a| >= |b|)
    vector<int> sub(const vector<int>& a, const vector<int>& b) const {
        vector<int> c(a.size(), 0);
        for (size_t i = 0; i < a.size(); ++i) {
            c[i] += a[i] - (i < b.size() ? b[i] : 0);
            if (c[i] < 0) {
                c[i] += 10;
                c[i + 1] -= 1;
            }
        }
        while (c.size() > 1 && c.back() == 0) c.pop_back();
        return c;
    }

    // 大整数乘法
    vector<int> mul(const vector<int>& a, const vector<int>& b) const {
        vector<int> c(a.size() + b.size(), 0);
        for (size_t i = 0; i < a.size(); ++i) {
            for (size_t j = 0; j < b.size(); ++j) {
                c[i + j] += a[i] * b[j];
                if (c[i + j] >= 10) {
                    c[i + j + 1] += c[i + j] / 10;
                    c[i + j] %= 10;
                }
            }
        }
        while (c.size() > 1 && c.back() == 0) c.pop_back();
        return c;
    }
// 大整数除法
    vector<int> div(vector<int>& a, vector<int>& b) const {
        auto& ma = cmpabs(a, b) == 1 ? a : b;
        auto& mi = cmpabs(a, b) == 1 ? b : a;
        vector<int> c(ma.size(), 0);
        vector<int> d = ma;
        d.push_back(0);  // 添加额外的位,以进行计算
        for (int i = ma.size() - mi.size(); i >= 0; i--) {
            while (cmpdiv(d, mi, i, mi.size())) {
                for (int j = 0; j < mi.size(); j++) {
                    d[i + j] -= mi[j];
                    if (d[i + j] < 0) {
                        d[i + j] += 10;
                        d[i + j + 1] -= 1;
                    }
                }
                c[i]++;
            }
        }
        while (!c.empty() && c.back() == 0) c.pop_back();  // 清除前导零
        return c;
    }
 // 大整数求余数
    vector<int> mod(vector<int>& a, vector<int>& b) const {
        auto& ma = cmpabs(a, b) == 1 ? a : b;
        auto& mi = cmpabs(a, b) == 1 ? b : a;
        vector<int> c(ma.size(), 0);
        vector<int> d = ma;
        d.push_back(0);  // 添加额外的位,以进行计算
        for (int i = ma.size() - mi.size(); i >= 0; i--) {
            while (cmpdiv(d, mi, i, b.size())) {
                for (int j = 0; j < mi.size(); j++) {
                    d[i + j] -= mi[j];
                    if (d[i + j] < 0) {
                        d[i + j] += 10;
                        d[i + j + 1] -= 1;
                    }
                }
                c[i]++;
            }
        }
        while (!d.empty() && d.back() == 0) d.pop_back();  // 清除前导零
        return d;
    }

// 比较除法中某个位置的值
    bool cmpdiv(const vector<int>& a, const vector<int>& b, int wei, int len) const {
        if (a[wei + len] != 0) return true;
        for (int i = len - 1; i >= 0; --i) {
            if (a[wei + i] > b[i]) return true;
            else if (a[wei + i] < b[i]) return false;
        }
        return true;
    }

    // 比较两个大整数的绝对值:1 表示 a > b,0 表示 a == b,-1 表示 a < b
    int cmpabs(const vector<int>& a, const vector<int>& b) const {
        if (a.size() != b.size()) return a.size() > b.size() ? 1 : -1;
        for (int i = a.size() - 1; i >= 0; --i) {
            if (a[i] != b[i]) return a[i] > b[i] ? 1 : -1;
        }
        return 0;
    }

public:
    // 默认构造函数
    bint(const string& s = "0") {
        sign = (s[0] == '-' ? -1 : 1);
        for (int i = s.size() - 1; i >= (s[0] == '-' ? 1 : 0); --i) {
            arr.push_back(s[i] - '0');
        }
        if (arr.empty()) arr.push_back(0);
    }

    // 输出函数
    void print() const {
        if (sign == -1 && !(arr.size() == 1 && arr[0] == 0)) cout << '-';
        for (int i = arr.size() - 1; i >= 0; --i) cout << arr[i];
        cout << endl;
    }

    // 加法运算符
    bint operator+(const bint& r) const {
        bint res;
        if (sign == r.sign) {
            res.arr = add(arr, r.arr);
            res.sign = sign;
        } else {
            int cmp = cmpabs(arr, r.arr);
            if (cmp == 0) {
                res.arr = {0};
                res.sign = 1;
            } else if (cmp > 0) {
                res.arr = sub(arr, r.arr);
                res.sign = sign;
            } else {
                res.arr = sub(r.arr, arr);
                res.sign = r.sign;
            }
        }
        return res;
    }

    // 减法运算符
    bint operator-(const bint& r) const {
        bint res;
        if (sign == r.sign) {
            int cmp = cmpabs(arr, r.arr);
            if (cmp == 0) {
                res.arr = {0};
                res.sign = 1;
            } else if (cmp > 0) {
                res.arr = sub(arr, r.arr);
                res.sign = sign;
            } else {
                res.arr = sub(r.arr, arr);
                res.sign = -sign;
            }
        } else {
            res.arr = add(arr, r.arr);
            res.sign = sign;
        }
        return res;
    }

    // 乘法运算符
    bint operator*(const bint& r) const {
        bint res;
        res.arr = mul(arr, r.arr);
        res.sign = sign * r.sign;
        if (res.arr.empty()) res.arr.push_back(0);
        return res;
    }

    // 比较运算符
    bool operator<(const bint& r) const {
        if (sign != r.sign) return sign < r.sign;
        int cmp = cmpabs(arr, r.arr);
        return sign == 1 ? cmp < 0 : cmp > 0;
    }

    bool operator>(const bint& r) const { return r < *this; }
    bool operator==(const bint& r) const { return sign == r.sign && arr == r.arr; }
    bool operator!=(const bint& r) const { return !(*this == r); }
};
posted @   Qacter  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示