• 高精度大整数模板


    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;
    	}
    };
    
  • 相关阅读:
    WDA学习(14):Colors Cell and Input Enable to ALV Column
    JavaScript try-catch语句(错误处理)
    constructor
    input file 重复上传同一张图片失效的解决办法
    input下拉带输入框
    box-shaw四边阴影详解
    苹方字体合集
    两个div不同高度并排显示
    弹窗库
    webstorm破解安装版本
  • 原文地址:https://www.cnblogs.com/WizardCowboy/p/7605110.html
Copyright © 2020-2023  润新知