加载中…

返回上一页

高精度

高精度模板

其实我认为这个玩意儿没什么必要写,但是它的确属于联赛知识点,我就直接把代码挂上,看着代码也很好理解.

struct bigint
{
	ll a[maxn],len=1;
	inline bigint() { memset(a,0,sizeof(a)); len=1; }
	inline bigint(ll x) { a[1]=x;len=1; }
};

加法

struct bigint
{
	ll a[maxn],len=1;
	inline bigint() { memset(a,0,sizeof(a)); len=1; }
	inline bigint(ll x) { a[1]=x;len=1; }
	inline friend bigint operator+(rg bigint a,rg bigint b)
	{
		rg bigint c;rll i=1;
		for(;i<=a.len||i<=b.len;i++)
		{
			c.a[i]+=a.a[i]+b.a[i];
			c.a[i+1]+=c.a[i]/base;c.a[i]%=base;
		}
		if(!c.a[i]) i--;c.len=i;return c;
	}
};

减法

struct bigint
{
	ll a[maxn],len=1;
	inline bigint() { memset(a,0,sizeof(a)); len=1; }
	inline bigint(ll x) { a[1]=x;len=1; }
	inline friend bigint operator-(rg bigint a,rg bigint b)
	{
		rg bigint c;
		rll i;
		for(i=1;i<=a.len||i<=b.len;i++)
		{
			if(a.a[i]<b.a[i])
				a.a[i]+=10,a.a[i+1]--;
			c.a[i]=a.a[i]-b.a[i];
		}
		while((!c.a[i])&&i>1) i--;
		c.len=i;
		return c;
	}
};

乘法

struct bigint
{
	ll a[maxm],len;
	bigint() { memset(a,0,sizeof(a));len=1; }
	bigint(rll x)
	{
		memset(a,0,sizeof(a));len=0;
		while(x) a[++len]=x%base,x/=base;
	}
	inline friend bigint operator*(rg bigint a,rll b)// 高乘低
	{
		rll x=0;
		for(rll i=1;i<=a.len;i++) { rll y=a.a[i]*b+x;a.a[i]=y%base;x=y/base; }
		while(x) a.a[++a.len]=x%base,x/=base;return a;
	}
	inline friend bigint operator*(rg bigint a,rg bigint b)// 高乘高
	{
		rg bigint c;
		for(rll i=1;i<=a.len;i++)
			for(rll j=1;j<=b.len;j++)
			{
				c.a[i+j-1]+=a.a[i]*b.a[j];
				c.a[i+j]+=c.a[i+j-1]/base;c.a[i+j-1]%=base;
			}
		c.len=a.len+b.len;while(c.len>1&&(!c.a[c.len])) c.len--;return c;
	}
};

除法

struct bigint
{
	ll a[maxm],len;
	bigint() { memset(a,0,sizeof(a));len=1; }
	bigint(rll x)
	{
		memset(a,0,sizeof(a));len=0;
		while(x) a[++len]=x%base,x/=base;
	}
	inline friend bigint operator/(rg bigint a,rll b)
	{
		rll x=0;
		for(rll i=a.len;i;i--) { x+=a.a[i];a.a[i]=x/b;x=x%b*base; }
		while((!a.a[a.len])&&a.len>1) a.len--;return a;
	}
};
posted @ 2022-10-05 07:02  1Liu  阅读(10)  评论(0)    收藏  举报