• 高精板子


    高精类模板

    基础实现凭借nofind

    功能

    高精类正整数加减乘除。
    高精类正整数与普通正整数类型加减乘除。(只是运算时转成高精并没有单独写所以复杂度不优)

    函数及默认参数

    LEN 压位高精的模数
    BASE_LEN 压位高精位数
    LEN 数位长度
    a 数组
    len 长度

    print()输出
    del_zero()清除前导零
    add()高精除法提前进位使用
    opd()返回奇偶性
    GNUM()构造函数,支持默认构造,传入数组、字符串、整形进行构造
    ~GNUM()析构函数
    operator+加法
    operator-减法
    operator*乘法
    operator/除法
    operator<大小比较
    operator<<输出流
    operator>>输入流

    class GNUM
    {
    private:
    	static const int BASE = 10;
    	static const int BASE_LEN = 1;
    	static const int LEN = 20100;
    	int a[LEN];
    	int len;
    
    public:
    	GNUM()
    	{
    		len = 0;
    		memset(a, 0, sizeof(a));
    	}
    	~GNUM()
    	{
    		len = 0;
    		memset(a, 0, sizeof(a));
    	}
    	template <typename T>
    	GNUM(T x)
    	{
    		len = 0;
    		memset(a, 0, sizeof(a));
    		if (x == 0)
    		{
    			a[++len] = x;
    			return;
    		}
    		while (x)
    		{
    			a[++len] = x % BASE;
    			x /= BASE;
    		}
    	}
    	template <typename Y>
    	GNUM(Y *s, int lenth)
    	{
    		len = lenth;
    		memcpy(a, s, sizeof(a));
    	}
    	GNUM(char *x)
    	{
    		len = 1;
    		register int lenth = strlen(x) - 1;
    		memset(a, 0, sizeof(a));
    		for (register int i = lenth, j = 1; i >= 0; --i)
    		{
    			if (j == BASE)
    				j = 1, ++len;
    			a[len] += (x[i] - '0') * j;
    			j *= 10;
    		}
    	}
    	friend istream &operator>>(istream &input, GNUM &in)
    	{
    		char s[LEN];
    		input >> s;
    		in = GNUM(s);
    		return input;
    	}
    	friend ostream &operator<<(ostream &output, GNUM out)
    	{
    		output << out.a[out.len];
    		for (register int i = out.len - 1; i; --i)
    		{
    			output << right << setw(BASE_LEN) <<
    
    				setfill('0') << out.a[i];
    		}
    		return output;
    	}
    	inline void print()
    	{
    		printf("%d", a[len]);
    		for (register int i = len - 1; i; --i)
    			printf("%04d", a[i]);
    	}
    	inline GNUM del_zero()
    	{
    		while (!a[len] && len > 1)
    			--len;
    	}
    	inline void add(int k)
    	{
    		if (!k && len == 1 && !a[1])
    			return;
    		for (register int i = len; i; --i)
    			a[i + 1] = a[i];
    		a[1] = k;
    		++len;
    	}
    	inline friend bool operator<(const GNUM &x, const GNUM &y)
    	{
    		if (x.len == y.len)
    		{
    			register int i;
    			for (i = x.len; x.a[i] == y.a[i] && i > 1; --i)
    				;
    			if (i >= 1)
    				return x.a[i] < y.a[i];
    			else
    				return false;
    		}
    		else
    			return x.len < y.len;
    	}
    	inline friend bool operator>(const GNUM &x, const GNUM &y)
    	{
    		if (x.len == y.len)
    		{
    			register int i;
    			for (i = x.len; x.a[i] == y.a[i] && i > 1; --i)
    				;
    			if (i >= 1)
    				return x.a[i] > y.a[i];
    			else
    				return false;
    		}
    		else
    			return x.len > y.len;
    		return false;
    	}
    	inline friend bool operator==(GNUM x, GNUM y)
    	{
    		if (x.len == y.len)
    		{
    			register int i;
    			for (i = x.len; x.a[i] == y.a[i] && i >= 1; --i)
    				;
    			if (i >= 1)
    				return false;
    			return true;
    		}
    		else
    			return false;
    		return false;
    	}
    	inline friend bool operator<=(const GNUM &x, const GNUM &y)
    	{
    		return !(x > y);
    	}
    	inline friend bool operator>=(const GNUM &x, const GNUM &y)
    	{
    		return !(x < y);
    	}
    	template <typename AF>
    	inline friend GNUM operator+(const GNUM &x, const AF &y)
    	{
    		return x + GNUM(y);
    	}
    	inline friend GNUM operator+(const GNUM &x, const GNUM &y)
    	{
    		GNUM res;
    		res.len = max(x.len, y.len);
    		int k = 0;
    		for (register int i = 1; i <= res.len; ++i)
    		{
    			res.a[i] = x.a[i] + y.a[i] + k;
    			k = res.a[i] / BASE;
    			res.a[i] %= BASE;
    		}
    		if (k)
    			res.a[++res.len] = k;
    		res.del_zero();
    		return res;
    	}
    	template <typename JF>
    	inline friend GNUM operator-(GNUM x, JF y)
    	{
    		return x - GNUM(y);
    	}
    	inline friend GNUM operator-(GNUM x, GNUM y)
    	{
    		if (x < y)
    			putchar('-'), swap(x, y);
    		GNUM res = x;
    		register int cnt = x.len;
    		for (register int i = 1; i <= cnt; ++i)
    		{
    			res.a[i] -= y.a[i];
    			if (res.a[i] < 0)
    				--res.a[i + 1], res.a[i] += BASE;
    		}
    		res.del_zero();
    		return res;
    	}
    	template <typename CF>
    	inline friend GNUM operator*(const GNUM &x, const CF &y)
    	{
    		return x * GNUM(y);
    	}
    	inline friend GNUM operator*(const GNUM &x, const GNUM &y)
    	{
    		GNUM res;
    		res.len = x.len + y.len;
    		for (register int i = 1; i <= x.len; ++i)
    		{
    			for (register int j = 1; j <= y.len; ++j)
    			{
    				res.a[i + j - 1] += x.a[i] * y.a[j];
    				res.a[i + j] += res.a[i + j - 1] / BASE;
    				res.a[i + j - 1] %= BASE;
    			}
    		}
    		res.del_zero();
    		return res;
    	}
    	template <typename GF>
    	inline friend GNUM operator/(const GNUM &x, const GF &y)
    	{
    		GNUM res;
    		res.len = x.len;
    		long long k = 0;
    		for (register int i = x.len; i; --i)
    		{
    			k = k * BASE + x.a[i];
    			res.a[i] = k / y;
    			k %= y;
    		}
    		res.del_zero();
    		return res;
    	}
    	inline friend GNUM operator/(const GNUM &x, const GNUM &y)
    	{
    		GNUM res, k;
    		res.len = x.len;
    		for (register int i = x.len; i; --i)
    		{
    			k.add(x.a[i]);
    			while (k >= y)
    				k = k - y, res.a[i]++;
    		}
    		res.del_zero();
    		return res;
    	}
    	inline bool opd()
    	{
    		return a[1] & 1;
    	}
    };
    
  • 相关阅读:
    JS中attribute和property的区别
    px(像素)、pt(点)、ppi、dpi、dp、sp之间的关系
    计算几何
    动态凸包
    斜率DP题目
    斜率DP个人理解
    后缀数组题目
    CF#190DIV.1
    MANACHER---求最长回文串
    扩展KMP题目
  • 原文地址:https://www.cnblogs.com/Shiina-Rikka/p/11811260.html
Copyright © 2020-2023  润新知