ICode9

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

高精度

2022-07-02 18:04:49  阅读:130  来源: 互联网

标签:return 高精度 int len bign operator bit


有个巨佬学长(zyf),写的一份高精,蛮好用的。

放出来以后方便套板子,啥都有,直接用就行。

以下为代码

namespace zyf{
	struct bign{
		static const int maxlen=200,width=8;
		static const long long limit=100000000LL;
		long long len,bit[maxlen];
		long long& operator[](int p){ return bit[p]; }
		void ClearBit(){ memset(bit,0,sizeof(bit)); }
		void Delete0(){ for(;!bit[len-1] && len>1;--len); }
		
		bign(int p=0){ *this=p; }
		bign& operator=(int p){
			ClearBit();
			len=p?0:1; for(;p;p/=limit) bit[len++]=p%limit;
			return *this;
		}
		bign(const char *p){ *this=p; }
		
		bign& operator+=(bign b){
			len=max(len,b.len)+1;
			for(int i=0;i<len;++i) bit[i]+=b[i],bit[i+1]+=bit[i]/limit,bit[i]%=limit;
			Delete0(); return *this;
		}
		bign& operator-=(bign b){
			for(int i=0;i<len;++i){ bit[i]-=b[i]; if(bit[i]<0) bit[i]+=limit,--bit[i+1]; }
			Delete0(); return *this;
		}
		bign& operator*=(bign b){
			bign a=*this; ClearBit(); len=a.len+b.len;
			for(int i=0;i<a.len;++i)
				for(int j=0;j<b.len;++j)
					bit[i+j]+=a[i]*b[j],bit[i+j+1]+=bit[i+j]/limit,bit[i+j]%=limit;
			Delete0(); return *this;
		}
		bign& operator*=(int b){
			++len; long long t=0;
			for (int i=0;i<len;++i)
				bit[i]=t+bit[i]*b,t=bit[i]/limit,bit[i]%=limit;
			Delete0(); return *this;
		}
		
		bign& operator/=(int b){
			for(int i=len-1;i>0;--i) bit[i-1]+=limit*(bit[i]%b),bit[i]/=b; bit[0]/=b;
			Delete0(); return *this;
		}
		
		bool operator<(bign b) const{
			if(len>b.len) return false;
			if(len<b.len) return true;
			for(int i=len-1;i>=0;--i)
				if(bit[i]!=b[i]) return bit[i]<b[i];
			return bit[0]<b[0];
		}
		bool operator==(bign b) const{ return !(*this<b) && !(b<*this); }
		bool operator!=(bign b) const{ return !(*this==b); }
		bool operator>(bign b) const{ return !(*this<b) && !(*this==b); }
		bool operator<=(bign b) const{ return *this<b || *this==b; }
		bool operator>=(bign b) const{ return *this>b || *this==b; }
		
		bool odd(){ return bit[0]%2==1; }
		bool even(){ return bit[0]%2==0; }
	};
	bign operator+(bign a,bign b){ return a+=b; }
	bign operator-(bign a,bign b){ return a-=b; }
	bign operator*(bign a,bign b){ return a*=b; }
	bign operator*(bign a,int b){ return a*=b; }
	bign operator/(bign a,int b){ return a/=b; }
	istream& operator>>(istream &is,bign &p){
		string s; is>>s; p=s.c_str();
		return is;
	}
	ostream& operator<<(ostream &os,bign p){
		os.fill('0'); os<<p.bit[p.len-1];
		for(int i=p.len-2;i>=0;--i){ os.width(bign::width); os<<p.bit[i]; }
		return os;
	}
	bign sqrt(bign x){
		bign head=1,tail=x;
		while(head<=tail){
			bign mid=(head+tail)/2;
			if(x<mid*mid) tail=mid-1; else head=mid+1;
		}
		return tail;
	}
	bign gcd(bign a,bign b){
		bign gcd=1;
		while(a!=b){
			if(a<b) swap(a,b);
			if(a.even() && b.even()) gcd*=2,a/=2,b/=2;
			else if(a.even() && b.odd()) a/=2;
			else if(a.odd() && b.even()) b/=2;
			else a=a-b;
		}
		return gcd*=a;
	}
}
using zyf::bign;

使用方法:使用 bign 定义高精度,maxlen 代表最大位数。

标签:return,高精度,int,len,bign,operator,bit
来源: https://www.cnblogs.com/LAK666/p/16438026.html

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

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

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

ICode9版权所有