大整数模板

5 篇文章 0 订阅

又臭又长系列233

嗯,没有写除法,乘法是T(10len^3)级别.....

常数极大

切勿模仿233333

int SYS=10;

class bign
{
	public:
	int v[300];
	int len;
	
	//====================================================
	//INIT
	//====================================================
	
	bign(){ memset(v,0,sizeof(v)); len=1; }
	
	bign(int k)
	{
		memset(v,0,sizeof(v));
		len=0; 
		while(k!=0)
		{ v[len++]=k%SYS; k/=SYS; }
	}
	
	bign(const char*f,int l)
	{
 		memset(v,0,sizeof(v));
 		len=1;
		for( len=0;len<l;len++ )
			v[l-len-1]=( f[len]>='0' && f[len]<='9' ) ? f[len]-'0' : f[len]-'A'+10;
	}
	
	bign(const bign&f)
	{
		len=f.len;
		memcpy(v,f.v,sizeof(v));
	}
	
	bign operator=(bign f)
	{
		memcpy(v,f.v,sizeof(v));
		len=f.len;
		return *this;
	}
	
	//===================================================
	//CALCULATION
	//====================================================
	
	int&operator[](const int&k)
	{ return v[k]; }
	
	
	//==========compare==========
	
	
	bool operator<(bign f)
	{
		if(len!=f.len) return len<f.len;
		for(int i=len-1;i>=0;i--)
		if(v[i]!=f[i]) return v[i]<f[i];
		return false;
	}
	bool operator<=(bign f)
	{
		if(len!=f.len) return len<f.len;
		for(int i=len-1;i>=0;i--)
		if(v[i]!=f[i]) return v[i]<f[i];
		return true;
	}
	
	bool operator>(bign f)
	{ return f<(*this); }
	bool operator>=(bign f)
	{ return f<=(*this); }
	
	bool operator==(bign f)
	{
		if(f.len!=len) return false;
		for(int i=len-1;i>=0;i--)
		if(v[i]!=f[i]) return false;
		return true;
	}
	
	
	//========== add ==========
	
	
	bign operator+(bign f)
	{
		bign c;
		
		c.len=max(len,f.len);
		
		for(int i=0;i<=c.len;i++)
		(c[i]+=v[i]+f[i]) >=SYS ? c[i]-=SYS,++c[i+1] : NULL;
		
		if(c[c.len]!=0) c.len++;
		
		return c;
	}
	
	bign operator+=(bign f)
	{
		len=max(len,f.len);
		
		for(int i=0;i<=len;i++)
		(v[i]+=f[i]) >=SYS ? v[i]-=SYS,++v[i+1] : NULL;
		
		if(v[len]!=0) len++;
		
		return *this;
	}
	
	bign operator+(int f)
	{
		bign c(f);
		return c+(*this);
	}
	
	
	//==========minus==========
	
	bign operator-(bign f) //return absolute.
	{
		if((*this)<f) return f-(*this); //make sure (*this) is larger
		
		bign c;
		c.len=len;
		
		for(int i=0;i<c.len;i++)
		(c[i]+=v[i]-f[i]) <0 ? c[i]+=SYS,--c[i+1] : NULL;
		
		while(c.len>0 && c[c.len]==0) c.len--;
		if(c[c.len]!=0 || c.len==0)c.len++;
		
		return c;
	}
	
	//==========multiply==========
	
	bign operator<<=(int k)
	{
		if(k==0) return *this;
		if(len==1 && v[0]==0) return *this;
		
		for(int i=len-1;i>=0;i--)
		v[i+k]=v[i];
		
		for(int i=0;i<k;i++)
		v[i]=0;
		
		len=len+k;
		
		return *this;
	}
	bign operator<<(int k)
	{
		bign c(*this);
		return (c<<=k);
	}
	
	bign operator>>=(int k)
	{
		if(k==0) return*this;
		
		for(int i=0;i<len-k;i++)
		v[i]=v[i+k];
		
		for(int i=max(0,len-k);i<len;i++)
		v[i]=0;
		
		len=max(1,len-k);
		return *this;
	}
	bign operator>>(int k)
	{
		bign c(*this);
		return (c>>=k);
	}
	
	bign operator*(int f)
	{
		bign c;
		
		int g=0;
		for(int i=0;i<len || g!=0;i++,c.len=i)
			c[i]=v[i]*f+g, g=c[i]/SYS, c[i]=c[i]%SYS ;
		
		while(c[c.len]==0 && c.len>=0 ) c.len--;
		c.len++;
		
		return c;
	}
	
	bign operator*(bign f)
	{
		bign c;
		c.len=len+f.len-1;
		
		for(int i=0;i<len;i++)
		{
			for(int j=0;j<f.len;j++)
				c[i+j]+=v[i]*f[j];
			
			for(int j=0;j<=c.len;j++)
				c[j]>=SYS ? c[j+1]+=c[j]/SYS , c[j]%=SYS : NULL;
		}
		
		for(int i=0;i<=c.len;i++)
		c[i]>=10 ? c[i+1]+=c[i]/SYS , c[i]/=SYS : NULL;
		
		if(c[c.len]!=0) c.len++;
		if(c[c.len]!=0) c.len++;
		
		return c;
	}
	
	//==========divide==========
	bign operator/(int k)
	{
		bign c;
		c.len=-1;
		
		int t=0;
		for(int i=len-1;i>=0;i--)
		{
			t=t*10+v[i];
			if(t/k!=0)
			{
				c[i]=t/k;
				t%=k;
				if(c.len==-1) c.len=i+1;
			}
		}
		
		if(c.len==-1) c.len=1;
		
		return c;
	}
	
	bign operator/(bign f)
	{
		bign c("0",1);
		
		if(f>(*this)) return c;
		
		c.len=-1;
		
		bign h("0",1);
		
		for(int i=len-1;i>=0;i--)
		{
			h=(h*10)+v[i];
			
			while(h>=f) h=h-f,c[i]++;
			
			if(c.len==-1 && c[i]!=0)
			c.len=i+1;
		}
		
		return c;
	}
	
	bign operator%(int k)
	{
		return (*this)-((*this)/k)*k;
	}
	
	bign operator%(bign f)
	{
		return (*this)-(*this)/f*f;
	}
	
	
	
	//====================================================
	//OUTPUT
	//====================================================
	
	void test()
	{
		printf("TEST : %d \n",len);
		printf("NUM: ");
		for(int i=len-1;i>=0;i--)
		printf("%d ",v[i]);
		printf("\n");
	}
	
	
	void output()
	{
		for(int i=len-1;i>=0;i--)
		if(v[i]>=0 && v[i]<=9) printf("%d",v[i]);
		else printf("%c",'A'+v[i]-10);
		
		printf("\n");
	}
	
	void output(int&k)
	{
		k=0;
		int s=1;
		for(int i=0;i<len;s*=SYS,i++)
		k+=s*v[i];
	}
	
	void output(char*f)
	{
		for(int i=0;i<len;i++)
		f[i]=v[i]+'0';
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值