BigInt类

持续维护中,根据需求更新。

struct BigInt {
    int l, a[23333], base;
    BigInt() {
        l = 0, base = 10;
        memset(a, 0, sizeof(a));
    }
    BigInt Trans(int x) {
        BigInt y;
        while (x)
            y.a[++y.l] = x % y.base, x /= y.base;
        return y;
    }
    friend BigInt operator +(BigInt x, BigInt y) {
        BigInt z;
        z.l = std::max(x.l, y.l);
        for (int i = 1; i <= z.l; i++)
            z.a[i] += x.a[i] + y.a[i], z.a[i + 1] += z.a[i] / x.base, z.a[i] %= x.base;
        if (z.a[z.l + 1]) z.l++;
        return z;
    }
    friend BigInt operator +(BigInt x, int y) {
        BigInt tmp = tmp.Trans(y);
        return x + tmp;
    }
    friend BigInt operator -(BigInt x, BigInt y) {
        BigInt z;
        z.l = std::max(x.l, y.l);
        for (int i = 1; i <= z.l; i++) {
            if (x.a[i] < y.a[i]) x.a[i] += x.base, x.a[i + 1]--;
            z.a[i] = x.a[i] - y.a[i];
        }
        while (!z.a[z.l] && z.l) z.l--;
        if (z.l == 0) z.a[1] = 1, z.l = 1;
        return z;
    }
    friend BigInt operator *(BigInt x, BigInt y) {
        BigInt z;
        z.l = x.l + y.l;
        if ((x.l == 1 && x.a[1] == 0) || (y.l == 1 && y.a[1] == 0)) {
            z.l = 1;
            return z;
        }
        for (int i = 1; i <= x.l; i++)
            for (int j = 1; j <= y.l; j++)
                z.a[i + j - 1] += x.a[i] * y.a[j], z.a[i + j] += z.a[i + j - 1] / x.base, z.a[i + j - 1] %= x.base;
        while (!z.a[z.l] && z.l) z.l--;
        if (!z.l) {z.l = 1, z.a[1] = 0;}
        return z;
    }
    friend BigInt operator *(BigInt x, int y) {
        BigInt z; int l = x.l;
        for (int i = 1; i <= l; i++)
            z.a[i] += x.a[i] * y, z.a[i + 1] += z.a[i] / x.base, z.a[i] %= x.base;
        while (z.a[l + 1])
            l++, z.a[l + 1] += z.a[l] / x.base, z.a[l] %= x.base;
        z.l = l;
        while (!z.a[z.l]) z.l--;
        return z;
    }
    friend BigInt operator /(BigInt x, int y) {
        BigInt z; z.l = x.l;
        int t = 0;
        for (int i = x.l; i >= 1; i--)
            t = t * 10 + x.a[i], z.a[i] = t / y, t %= y;
        while (!z.a[z.l]) z.l--;
        return z;
    }
    void print() {
        for (int i = l; i >= 1; i--)
            printf("%d", a[i]);
        printf("\n");
    }
};

转载于:https://www.cnblogs.com/gekoo/p/11222781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值