高精度大整数模板

Code


struct BigInteger
{
    int len, negative;
    int val[1005];
    /*      转换      */
    BigInteger(int x = 0)
    {
        I_TO_B(x);
    }
    BigInteger(char *st)
    {
        C_TO_B(st);
    }
    void C_TO_B(char *st)
    {
    	negative = 0;
        len = strlen(st);
        memset(val, 0, sizeof(val));
        rep(i, 0, len - 1) val[i] = st[len - i - 1] - '0';
        if (st[0] == '-') val[--len] = 0, negative = 1;
        while(len > 0 && val[len - 1] == 0) len--;
    }
    void I_TO_B(int x)
    {
    	negative = 0;
        if (x < 0) x = -x, negative = 1;
        len = 0;
        memset(val, 0, sizeof(val));
        while(x)
        {
            val[len++] = x % 10;
            x /= 10;
        }
    }
    /*      输入输出      */
    friend istream &operator >>(istream &in, BigInteger &t)
    {
        char st[1005];
        in >> st;
        t.C_TO_B(st);
        return in;
    }
    friend ostream &operator <<(ostream &out, BigInteger &t)
    {
        if (t.negative) putchar('-');
        per(i, t.len - 1, 0)
            out << t.val[i];
        return out;
    }
    void print()
    {
        if (negative) putchar('-');
        per(i, len - 1, 0)
            putchar(val[i] + '0');
        putchar('
');
    }
    /*      其他      */
    friend void swap(BigInteger &x, BigInteger &y)
    {
        BigInteger t = x;
        x = y;
        y = t;
    }
    friend BigInteger operator -(BigInteger x)
    {
        BigInteger t = x;
        t.negative = 1 - t.negative;
        return t;
    }
    friend BigInteger abs(BigInteger x)
    {
        BigInteger t = x;
        t.negative = 0;
        return t;
    }
    /*      等于      or      不等于      */
    friend bool operator ==(BigInteger x, BigInteger y)
    {
        if (x.negative != y.negative) return 0;
        if (x.len != y.len) return 0;
        per(i, x.len - 1, 0)
            if (x.val[i] != y.val[i]) return 0;
        return 1;
    }
    friend bool operator ==(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x == y;
    }
    friend bool operator ==(int t, BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return x == y;
    }
    friend bool operator !=(BigInteger x, BigInteger y)
    {
        return !(x == y);
    }
    friend bool operator !=(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return !(x == y);
    }
    friend bool operator !=(const int t, const BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return !(x == y);
    }
    /*      小于      or      大于      */
    friend bool operator <(BigInteger x, BigInteger y)
    {
        if (x.negative && !y.negative) return 1;
        if (!x.negative && y.negative) return 0;
        if (x.negative && y.negative) swap(x, y);
        if (x.len < y.len) return 1;
        if (x.len > y.len) return 0;
        per(i, x.len - 1, 0)
            if (x.val[i] < y.val[i]) return 1;
            else if (x.val[i] > y.val[i]) return 0;
        return 0;
    }
    friend bool operator <(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x < y;
    }
    friend bool operator <(int t, BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return x < y;
    }
    friend bool operator >(BigInteger x, BigInteger y)
    {
        return y < x;
    }
    friend bool operator >(BigInteger x, int y)
    {
        return y < x;
    }
    friend bool operator >(int x, BigInteger y)
    {
        return  y < x;
    }
    /*      小于等于      or      大于等于      */
    friend bool operator <=(BigInteger x, BigInteger y)
    {
        return x < y || x == y;
    }
    friend bool operator <=(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x < y || x == y;
    }
    friend bool operator <=(int t, BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return x < y || x == y;
    }
    friend bool operator >=(BigInteger x, BigInteger y)
    {
        return y <= x;
    }
    friend bool operator >=(BigInteger x, int y)
    {
        return y <= x;
    }
    friend bool operator >=(int x, BigInteger y)
    {
        return  y <= x;
    }
    /*      加法      */
    friend BigInteger operator +(BigInteger x, BigInteger y)
    {
        if (x.negative && y.negative) return -(abs(x) + abs(y));
        if (x.negative && !y.negative) return y - abs(x);
        if (!x.negative && y.negative) return x - abs(y);
        int len = x.len > y.len ? x.len : y.len;
        BigInteger ans;
        rep(i, 0, len - 1)
        {
            ans.val[i] += x.val[i] + y.val[i];
            ans.val[i + 1] += ans.val[i] / 10;
            ans.val[i] %= 10;
        }
        if (ans.val[len] != 0) len++;
        ans.len = len;
        return ans;
    }
    friend BigInteger operator +(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x + y;
    }
    friend void operator +=(BigInteger &x, BigInteger y)
    {
        x = x + y;
    }
    friend void operator +=(BigInteger &x, int t)
    {
        x = x + t;
    }
    friend void operator ++(BigInteger &x)
    {
    	x += 1;
	}
    /*      减法      */
    friend BigInteger operator -(BigInteger x, BigInteger y)
    {
        if (x.negative && y.negative) return abs(y) - abs(x);
        if (x.negative && !y.negative) return -(abs(x) + y);
        if (!x.negative && y.negative) return x + abs(y);
        BigInteger ans;
        if (x < y)
        {
            swap(x, y);
            ans.negative = 1;
        }
        int len = max(x.len, y.len);
        rep(i, 0, len - 1)
        {
            ans.val[i] += x.val[i] - y.val[i];
            if (ans.val[i] < 0)
            {
                ans.val[i] += 10;
                ans.val[i + 1]--;
            }
        }
        while(len > 1 && ans.val[len - 1] == 0) len--;
        ans.len = len;
        return ans;
    }
    friend BigInteger operator -(int t, BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return x - y;
    }
    friend BigInteger operator -(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x - y;
    }
    friend void operator -=(BigInteger &x, BigInteger y)
    {
        x = x - y;
    }
    friend void operator -=(BigInteger &x, int y)
    {
        x = x - y;
    }
    friend void operator --(BigInteger &x)
    {
    	x -= 1;
	}
    /*      乘法      */

    friend BigInteger operator *(BigInteger x, BigInteger y)
    {
        BigInteger ans;
        ans.negative = (x.negative ^ y.negative);
        int len = x.len + y.len;
        rep(i, 0, x.len - 1)
            rep(j, 0, y.len - 1)
                ans.val[i + j] += x.val[i] * y.val[j];
        rep(i, 0, len - 1)
        {
            ans.val[i + 1] += ans.val[i] / 10;
            ans.val[i] %= 10;
        }
        while(len > 1 && ans.val[len - 1] == 0) len--;
        ans.len = len;
        return ans;
    }
    friend BigInteger operator *(BigInteger x, int t)
    {
        BigInteger y;
        y.I_TO_B(t);
        return x * y;
    }
    friend BigInteger operator *(int t, BigInteger y)
    {
        BigInteger x;
        x.I_TO_B(t);
        return x * y;
    }
    friend void operator *=(BigInteger &x, BigInteger y)
    {
        x = x * y;
    }
    friend void operator *=(BigInteger &x, int t)
    {
        x = x * t;
    }
    /*      除法      */
	friend BigInteger operator /(BigInteger x, BigInteger y) 
	{
		BigInteger R, ans;
		if (y.len == 1 && y.val[0] == 0) return R;
		per(i, x.len - 1, 0)
		{
			ans *= 10;
			R = R * 10 + x.val[i];
			while(R >= y)
			{
				++ans;
				R -= y;
			}
		}
		return ans;
	}
	friend BigInteger operator /(BigInteger x, int t)
	{
		BigInteger y;
		y.I_TO_B(t);
		return x / y;
	}
	friend BigInteger operator %(BigInteger x, BigInteger y)
	{
		return x - x / y;
	}
	friend BigInteger operator %(BigInteger x, int t)
	{
		return x - x / t;
	}
	friend void operator /=(BigInteger &x, BigInteger y)
	{
		x = x / y;
	}
	friend void operator /=(BigInteger &x, int t)
	{
		x = x / t;
	}
	friend void operator %=(BigInteger &x, BigInteger y)
	{
		x = x % y;
	}
	friend void operator %=(BigInteger &x, int t)
	{
		x = x % t;
	}
};
原文地址:https://www.cnblogs.com/WizardCowboy/p/7605110.html