ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

高精度模板

2021-11-18 19:32:34  阅读:139  来源: 互联网

标签:return 高精度 int bigint base operator const 模板


看到一个非常不错的高精度模板,记录一下

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int base = 1e8;
const int N = 1e4 + 10;
int aux[N << 3];
struct bigint {
	int s[N], l;
	void CL() { l = 0; memset(s, 0, sizeof(s)); }
	void pr()
	{
		printf("%d", s[l]);
		for (int i = l - 1; i; i--)
			printf("%08d", s[i]);
	}
	void re_l()
	{
		int i, x = 0, k = 1, L = 0, fl, o;
		char c = getchar();
		for (; c < '0' || c > '9'; c = getchar());
		for (; c >= '0' && c <= '9'; c = getchar())
		{
			if (!(L - 1) && !aux[L])
				L--;
			aux[++L] = c - '0';
		}
		CL();
		l = L / 8 + ((o = L % 8) > 0);
		for (i = 1; i <= o; i++)
			x = x * 10 + aux[i];
		if (o)
			s[l] = x;
		for (fl = !o ? l + 1 : l, i = o + 1, x = 0; i <= L; i++, k++)
		{
			x = x * 10 + aux[i];
			if (!(k ^ 8))
				s[--fl] = x, x = k = 0;
		}
		if (!l)
			l = 1;
	}
	ll toint()
	{
		ll x = 0;
		for (int i = l; i; i--)
			x = x * base + s[i];
		return x;
	}
	bigint operator = (int b)
	{
		CL();
		do
		{
			s[++l] = b % base;
			b /= base;
		} while (b > 0);
		return *this;
	}
	bigint operator = (ll b)
	{
		CL();
		do
		{
			s[++l] = b % base;
			b /= base;
		} while (b > 0);
		return *this;
	}
	bigint operator + (const int& b)
	{
		bigint c = *this;
		ll x = b;
		for (int i = 1; i <= l && x; i++)
		{
			x = x + c.s[i];
			c.s[i] = x % base;
			x /= base;
		}
		if (x)
			c.s[++c.l] = x;
		return c;
	}
	bigint operator + (const ll & b)
	{
		bigint c = *this;
		ll x = b;
		for (int i = 1; i <= l && x; i++)
		{
			x = x + c.s[i];
			c.s[i] = x % base;
			x /= base;
		}
		if (x)
			c.s[++c.l] = x;
		return c;
	}
	bigint operator + (bigint & b)
	{
		if (b.l < 3)
			return *this + b.toint();
		bigint c;
		ll x = 0;
		int k = l < b.l ? b.l : l;
		c.CL(); c.l = k;
		for (int i = 1; i <= k; i++)
		{
			x = x + s[i] + b.s[i];
			c.s[i] = x % base;
			x /= base;
		}
		if (x)
			c.s[++c.l] = x;
		return c;
	}
	bigint operator - (const bigint & b)
	{
		bigint c, d = *this;
		ll x = 0;
		c.CL();
		for (int i = 1; i <= l; i++)
		{
			if ((x = d.s[i]) < b.s[i])
			{
				d.s[i + 1]--;
				x += base;
			}
			c.s[i] = x - b.s[i];
		}
		c.l = l;
		for (; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator - (const int& b) { bigint c; return *this - (c = b); }
	bigint operator - (const ll & b) { bigint c; return *this - (c = b); }
	bigint operator * (const int& b)
	{
		bigint c;
		ll x = 0;
		c.CL();
		for (int i = 1; i <= l; i++)
		{
			x = x + 1LL * s[i] * b;
			c.s[i] = x % base;
			x /= base;
		}
		for (c.l = l; x; x /= base)
			c.s[++c.l] = x % base;
		return c;
	}
	bigint operator * (bigint & b)
	{
		if (b.l < 2)
			return *this * b.toint();
		bigint c;
		ll x;
		int i, j, k;
		c.CL();
		for (i = 1; i <= l; i++)
		{
			x = 0;
			for (j = 1; j <= b.l; j++)
			{
				x = x + 1LL * s[i] * b.s[j] + c.s[k = i + j - 1];
				c.s[k] = x % base;
				x /= base;
			}
			if (x)
				c.s[i + b.l] = x;
		}
		for (c.l = l + b.l; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator * (const ll & b)
	{
		bigint c;
		if (b > 2e9)
		{
			c = b;
			return *this* c;
		}
		ll x = 0;
		c.CL();
		for (int i = 1; i <= l; i++)
		{
			x = x + b * s[i];
			c.s[i] = x % base;
			x /= base;
		}
		for (c.l = l; x; x /= base)
			c.s[++c.l] = x % base;
		return c;
	}
	bigint operator / (const int& b)
	{
		bigint c;
		ll x = 0;
		c.CL();
		for (int i = l; i; i--)
		{
			c.s[i] = (x * base + s[i]) / b;
			x = (x * base + s[i]) % b;
		}
		for (c.l = l; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator / (const ll & b)
	{
		bigint c;
		ll x = 0;
		c.CL();
		for (int i = l; i; i--)
		{
			c.s[i] = (x * base + s[i]) / b;
			x = (x * base + s[i]) % b;
		}
		for (c.l = l; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator / (bigint & b)
	{
		if (b.l < 2)
			return *this / b.toint();
		bigint c, d;
		int i, j, le, r, mid, k;
		c.CL(); d.CL();
		for (i = l; i; i--)
		{
			for (j = ++d.l; j > 1; j--)
				d.s[j] = d.s[j - 1];
			d.s[1] = s[i];
			if (d < b)
				continue;
			le = k = 0; r = base - 1;
			while (le <= r)
			{
				mid = (le + r) >> 1;
				b * mid <= d ? le = mid + 1, k = mid : r = mid - 1;
			}
			c.s[i] = k; d = d - b * k;
		}
		for (c.l = l; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator % (const int& b)
	{
		bigint c;
		ll x = 0;
		c.CL();
		for (int i = l; i; i--)
			x = (x * base + s[i]) % b;
		return c = x;
	}
	bigint operator % (const ll & b)
	{
		bigint c;
		ll x = 0;
		c.CL();
		for (int i = l; i; i--)
			x = (x * base + s[i]) % b;
		return c = x;
	}
	bigint operator % (bigint & b)
	{
		if (b.l < 2)
			return *this % b.toint();
		bigint c;
		int i, j, le, r, mid, k;
		c.CL();
		for (i = l; i; i--)
		{
			for (j = ++c.l; j > 1; j--)
				c.s[j] = c.s[j - 1];
			c.s[1] = s[i];
			if (c < b)
				continue;
			le = k = 0; r = base - 1;
			while (le <= r)
			{
				mid = (le + r) >> 1;
				b * mid <= c ? le = mid + 1, k = mid : r = mid - 1;
			}
			c = c - b * k;
		}
		for (; !c.s[c.l] && c.l > 1; c.l--);
		return c;
	}
	bigint operator += (bigint & b) { return *this = *this + b; }
	bigint operator += (ll b) { return *this = *this + b; }
	bigint operator += (int b) { return *this = *this + b; }
	bigint operator -= (bigint & b) { return *this = *this - b; }
	bigint operator -= (ll b) { return *this = *this - b; }
	bigint operator -= (int b) { return *this = *this - b; }
	bigint operator *= (bigint & b) { return *this = *this * b; }
	bigint operator *= (ll b) { return *this = *this * b; }
	bigint operator *= (int b) { return *this = *this * b; }
	bigint operator /= (bigint & b) { return *this = *this / b; }
	bigint operator /= (ll b) { return *this = *this / b; }
	bigint operator /= (int b) { return *this = *this / b; }
	bigint operator %= (bigint & b) { return *this = *this % b; }
	bigint operator %= (ll b) { return *this = *this % b; }
	bigint operator %= (int b) { return *this = *this % b; }
	bool operator < (const bigint & b) const
	{
		if (l ^ b.l)
			return l < b.l;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return s[i] < b.s[i];
		return false;
	}
	bool operator <= (const bigint & b) const
	{
		if (l ^ b.l)
			return l < b.l;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return s[i] < b.s[i];
		return true;
	}
	bool operator > (const bigint & b) const
	{
		if (l ^ b.l)
			return l > b.l;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return s[i] > b.s[i];
		return false;
	}
	bool operator >= (const bigint & b) const
	{
		if (l ^ b.l)
			return l > b.l;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return s[i] > b.s[i];
		return true;
	}
	bool operator == (const bigint & b) const
	{
		if (l ^ b.l)
			return false;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return false;
		return true;
	}
	bool operator != (const bigint & b) const
	{
		if (l ^ b.l)
			return true;
		for (int i = l; i; i--)
			if (s[i] ^ b.s[i])
				return true;
		return false;
	}
	bool operator < (ll b) const { bigint c; return *this < (c = b); }
	bool operator <= (ll b) const { bigint c; return *this <= (c = b); }
	bool operator > (ll b) const { bigint c; return *this > (c = b); }
	bool operator >= (ll b) const { bigint c; return *this >= (c = b); }
	bool operator == (ll b) const { bigint c; return *this == (c = b); }
	bool operator != (ll b) const { bigint c; return *this != (c = b); }
	bool operator < (int b) const { bigint c; return *this < (c = b); }
	bool operator <= (int b) const { bigint c; return *this <= (c = b); }
	bool operator > (int b) const { bigint c; return *this > (c = b); }
	bool operator >= (int b) const { bigint c; return *this >= (c = b); }
	bool operator == (int b) const { bigint c; return *this == (c = b); }
	bool operator != (int b) const { bigint c; return *this != (c = b); }
};
bigint a, b;
int main()
{
	a.re_l(); b.re_l();
	(a + b).pr(); printf("\n");
	if (a < b)
		putchar('-'), (b - a).pr();
	else
		(a - b).pr();
	printf("\n");
	(a * b).pr(); printf("\n");
	(a / b).pr(); printf("\n");
	(a % b).pr(); printf("\n");
	if (a < b)
		printf("a < b\n");
	if (a <= b)
		printf("a <= b\n");
	if (a > b)
		printf("a > b\n");
	if (a >= b)
		printf("a >= b\n");
	if (a == b)
		printf("a == b\n");
	if (a != b)
		printf("a != b\n");
	return 0;
}

标签:return,高精度,int,bigint,base,operator,const,模板
来源: https://blog.csdn.net/qq_35975367/article/details/121408078

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有