模板-普通高精度类

类 X 结构体 ✓

namespace是为了方便收纳用的(等于没开)

namespace cr_Bigint
{
  /*
   *无符号高精度整数模板 
   */
	const int Ba=10000;//压四位高精度数
	const int NL=114514;
	struct Bigint
	{
		int bit[NL],len;
		Bigint(){memset(bit,0,NL*4);}
		Bigint(int _len){len=_len; memset(bit,0,NL*4);}
		//Bigint(ll t){for(;t;){bit[++len]=t%10000;t/=10000;}}
	};
	inline Bigint LLToBigint(ll t)
	{
		Bigint c(0);
		for(;t;){c.bit[++c.len]=t%10000;t/=10000;}
		return c;
	}
  //IO
	char temp[191981];
	inline void ReadBigint(Bigint& a)
	{
		scanf("%s",temp);
		int lent=strlen(temp);
		a.len=1;
		for(int i=lent-1,p=1,s=1;i>=0;--i,s*=10)
		{
			a.bit[p]+=(temp[i]-'0')*s;
			if(s==10000)
			{
				a.bit[p+1]=a.bit[p]/10000, a.bit[p]%=10000, a.len++;
				p++,s=1;
			}
		}
		for(;!a.bit[a.len] && a.len>=1;--a.len);
	}
	inline void WriteBigint(Bigint a)
	{
		sprintf(temp,"%d",a.bit[a.len]);
		for(int i=a.len-1;i>0;--i) sprintf(temp,"%s%04d",temp,a.bit[i]);
		printf("%s\n",temp);
	}
	inline void DebugBigint(Bigint a)
	{
		printf("len:%d\n",a.len);
		for(int i=1;i<=a.len;++i) printf("Bit%d=%d\n",i,a.bit[i]);
	}
  //compare
	bool operator== (const Bigint& a,const Bigint& b)
	{
		if(a.len!=b.len)	return false;
		for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return false;
		return true;
	}
	bool operator< (const Bigint& a,const Bigint& b)
	{
		if(a.len<b.len)	return true;
		if(a.len>b.len)	return false;
		for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return a.bit[i]<b.bit[i];
		return false;
	}
	bool operator<= (const Bigint& a,const Bigint& b)
	{
		if(a.len<b.len)	return true;
		if(a.len>b.len)	return false;
		for(int i=a.len;i>0;--i) if(a.bit[i]!=b.bit[i]) return a.bit[i]<b.bit[i];
		return true;
	}
	bool operator> (const Bigint& a,const Bigint& b){return !(a<=b);}
	bool operator>= (const Bigint& a,const Bigint& b){return !(a<b);}
	bool operator!= (const Bigint& a,const Bigint& b){return !(a==b);}
  //加减法
	Bigint operator+ (const Bigint& a,const Bigint& b)
	{
		Bigint c(max(a.len,b.len));
		for(int i=1;i<=c.len;++i)
		{
			c.bit[i]+=a.bit[i]+b.bit[i];
			c.bit[i+1]+=c.bit[i]/10000, c.bit[i]%=10000;
		}
		if(c.bit[c.len+1]) ++c.len;
		return c;
	}
	Bigint operator+ (const Bigint& a,const ll& b){return a+LLToBigint(b);}
	Bigint operator- (const Bigint& a,const Bigint& b)
	{
		Bigint c(max(a.len,b.len));
		for(int i=c.len;i>0;--i)
		{
			c.bit[i]=a.bit[i]-b.bit[i];
			for(int j=i;j<=c.len;++j)
				if(c.bit[j]>=0) break;
				else --c.bit[j+1],c.bit[j]+=10000;
		}
		if(!c.bit[c.len]&&c.len>1) --c.len;
		return c;
	}
	Bigint operator- (const Bigint& a,const ll& b){return a-LLToBigint(b);}
  //乘法
	Bigint operator* (const Bigint& a,const Bigint& b)
	{
		Bigint c(a.len+b.len-1);
		for(int i=1;i<=a.len;++i)
			for(int j=1;j<=b.len;++j)
			{
				c.bit[i+j-1]+=a.bit[i]*b.bit[j];
				c.bit[i+j]+=c.bit[i+j-1]/10000, c.bit[i+j-1]%=10000;
			}
		for(;c.bit[c.len+1];++c.len);
		return c;
	}
	Bigint operator* (const Bigint& a,const ll& b){return a*LLToBigint(b);}
  //除法
	Bigint divR(Bigint a,int b,int& r)
	{
		Bigint c(a.len);
		for(int i=a.len;i>0;--i)
			c.bit[i]=a.bit[i]/b, a.bit[i-1]+=a.bit[i]%b*10000;
		for(;!c.bit[c.len]&&c.len>1;--c.len);
		r=a.bit[0]/10000;
		return c;
	}
	void ry(Bigint& a)//右移 
	{
		for(int i=a.len;i>0;--i)
		{
			if((a.bit[i]&1) && i>1) a.bit[i-1]+=10000;
			a.bit[i]>>=1;
		}
		if(!a.bit[a.len]&&a.len>1) --a.len;
	}
	void ly(Bigint& a)//左移 
	{
		for(int i=1;i<=a.len+1;++i)
		{
			a.bit[i]<<=1;
			if(a.bit[i-1]>=10000) a.bit[i-1]-=10000,++a.bit[i];
		}
		if(a.bit[a.len+1]) ++a.len;
	}
	Bigint divR(Bigint a,Bigint b,Bigint& r)
	{
		Bigint cp=LLToBigint(1),c(abs(a.len-b.len+1));
		for(;a>=b; ly(b),ly(cp));
		for(;cp.len>1 || cp.bit[1]; ry(b),ry(cp))
			if(a>=b) a=a-b, c=c+cp;
		for(;!c.bit[c.len]&&c.len>1;--c.len);
		r=a;
		return c;
	}
//end
} using namespace cr_Bigint;
posted @ 2021-11-12 16:54  Coinred  阅读(41)  评论(0)    收藏  举报