高精全家桶

  • 重载运算符写法
bool operator<(string a,string b){//判断string状态下的数字大小
	if(a.size()!=b.size())
		return a.size()<b.size();
	for(int i=0;i<a.size();++i)
		if(a[i]!=b[i])
			return a[i]<b[i];
	return 1;
}

void _0(string &x){//去除前导零
	while(x.size() && x[0]=='0')
		x.erase(x.begin());
	if(!x.size()) x="0";
	return ;
}

string operator+(string a,string b){//高精加
	string ans="";
	if(a.size()>b.size())
		swap(a,b);
	while(a.size()<b.size())
		a='0'+a;
	int j=0;
	for(int i=a.size()-1;i>-1;--i){
		int x=(a[i]+b[i]-'0'-'0')+j;
		j=x/10;
		ans=char(x%10+'0')+ans;
	}
	while(j){
		ans=char(j%10+'0')+ans;
		j/=10;
	}
	return ans;
}

string operator-(string a,string b){//高精减
	string ans="";
	bool s=0;
	if(a<b){
		swap(a,b);
		s=1;
	}
	while(b.size()<a.size())
		b='0'+b;
	int j=0;
	for(int i=a.size()-1;i>-1;--i){
		int x=a[i]-b[i]-j;
		j=0;
		while(x<0) ++j,x+=10;
		ans=char(x+'0')+ans;
	}
	while(ans.size() && ans[0]=='0')
		ans.erase(ans.begin());
	if(!ans.size()) ans="0";
	if(ans!="0" && s) ans='-'+ans;
	return ans;
}

string operator*(string a,string b){//高精乘,需高精加
	string ans="";
	int jin;
	string dx,dy="";
	for(int i=a.size()-1;i>-1;--i){
		jin=0;
		dx=dy;
		for(int j=b.size()-1;j>-1;--j){
			int x=(b[j]-'0')*(a[i]-'0')+jin;
			jin=x/10;
			ans=ans+(char(x%10+'0')+dx);
			dx+='0';
		}
		while(jin){
			ans=ans+(char(jin%10+'0')+dx);
			dx+='0',jin/=10;
		}
		dy+='0';
	}
	return ans;
}

pair<string,string> operator/(string a,string b){//高精除,需高精加、减
	pair<string,string>ans;
	ans.first=ans.second="";
	string dx="";
	for(int i=0;i<a.size();++i){
		dx+=a[i];
		ans.first+='0';
		while(b<dx){
			ans.first=ans.first+(string)"1";
			dx=dx-b;
		}
	}
	ans.second=dx;//余数
	while(ans.first.size() && ans.first[0]=='0')
		ans.first.erase(ans.first.begin());
	if(!ans.first.size())
		ans.first="0";
	return ans;
}
  • 用整数数组模拟字符串(乘法)
struct memr{
	int c[400];
	int h;//存储用了多长的数组
};

void mul(memr a,memr b,memr &d){
	memset(d.c,0,sizeof(d.c));
	d.h=-1;
	for(re int i=0;i<=a.h;++i){
		for(re int j=0;j<=b.h;++j){
			long long dx=1ll*a.c[i]*b.c[j];
			int id=i+j-1;
			while(dx){
				++id;
				dx+=d.c[id];
				d.c[id]=(dx%mod); 
				dx/=mod;
				d.h=max(d.h,id);
			}
		}
	}
	return ;
}

int g(int x){
	int cnt=0;
	while(x){
		++cnt;
		x/=10;
	}
	return cnt;
}

void print(memr a){
	for(re int i=a.h;i>-1;--i){
		if(i!=a.h){
			for(re int j=0;j<8-g(a.c[i]);++j)//输出记得补0
				putchar('0');
		}
		printf("%d",a.c[i]);
	}
	return ;
}
posted @ 2023-01-30 15:27  Star_LIcsAy  阅读(51)  评论(0)    收藏  举报