高精度

模板

搬自这位神仙的博客

/*高精板子*/
struct bign{
	int len,s[30010];
	bign(){
		memset(s,0,sizeof(s));
		len=1;
	}
	bign(int num){*this=num;}
	bign(const char *num){*this=num;}
	
	bign operator = (const int num){
		char s[30010];
		sprintf(s,"%d",num);
		*this=s;
		return *this;
	}
	void clean(){
		while(len>1&&!s[len-1]) len--;
	}
	bign operator = (const char *num){
		memset(s,0,sizeof(s));
		len=strlen(num);
		for(int i=0;i<len;i++){
			if(isdigit(num[len-i-1])) s[i]=num[len-i-1]-'0';
			else s[i]=num[len-i-1]-'A'+10;
		}
		clean();
		return *this;
	}
	bign operator + (const bign &b) const{
		bign c;
		c.len=max(len,b.len);
		for(int i=0;i<=c.len;i++){
			c.s[i]+=s[i]+b.s[i];
			c.s[i+1]+=c.s[i]/10;
			c.s[i]%=10;
		}
		if(c.s[c.len]) c.len++;
		c.clean();
		return c;
	}
	bign operator += (const bign &b){
		*this=*this+b;
		return *this;
	}
	bign operator * (const bign &b){
		bign c;
		c.len=len+b.len;
		for(int i=0;i<len;i++){
			for(int j=0;j<b.len;j++){
				c.s[i+j]+=s[i]*b.s[j];
			}
		}
		for(int i=0;i<c.len;i++){
			c.s[i+1]+=c.s[i]/10;
			c.s[i]%=10;
		}
		c.clean();
		return c;
	}
	bign operator *= (const bign &b){
		*this =*this*b;
		return *this;
	}
	bign operator - (const bign &b){
		bign c;
		c.len=0;
		for(int i=0,g=0;i<len;i++){
			int x=s[i]-g;
			if(i<b.len) x-=b.s[i];
			if(x>=0) g=0;
			else{g=1; x+=10;}
			c.s[c.len++]=x;
		}
		c.clean();
		return c;
	}
	bign operator -= (const bign &b){
		*this=*this-b;
		return *this;
	}
	bign operator / (const int &b){
		int f=0;
		bign c;
		for(int i=len-1;i>=0;i--){
			f=f*10+s[i];
			c.s[i]=f/b;
			f%=b;
		}
		c.len=len;
		c.clean();
		return c;
	}
	bign operator / (const bign &b){
		bign c,f=0;
		for(int i=len-1;i>=0;i--){
			f=f*10;
			f.s[0]=s[i];
			while(f>b||f==b){
				f-=b;
				c.s[i]++;
			}
		}
		c.len=len;
		c.clean();
		return c;
	}
	bign operator /= (const bign &b){
		*this=*this/b;
		return *this;
	}
	bign operator % (const bign &b){
		bign r=*this/b;
		r=*this-r*b;
		return r;
	}
	bign operator %= (const bign &b){
		*this=*this%b;
		return *this;
	}
	bool operator < (const bign &b){
		if(len!=b.len) return len<b.len;
		for(int i=len-1;i>=0;i--){
			if(s[i]!=b.s[i]) return s[i]<b.s[i];
		}
		return false;
	}
	bool operator > (const bign &b){
		if(len!=b.len) return len>b.len;
		for(int i=len-1;i>=0;i--){
			if(s[i]!=b.s[i]) return s[i]>b.s[i];
		}
		return false;
	}
	bool operator == (const bign &b){
		return !(*this>b)&&!(*this<b);
	}
	string str() const{
		string res="";
		for(int =0;i<len;i++){
			if(s[i]<10) res=char(s[i]+'0')+res;
			else res=char(s[i]+'A'-10)+res;
		}
		return res;
	}
}a,b,c;

例题

题目 不附例题我自己可能都不知道该怎么用

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 1010
using namespace std;

/*高精板子*/
struct bign{
	int len,s[30010];
	bign(){
		memset(s,0,sizeof(s));
		len=1;
	}
	bign(int num){*this=num;}
	bign(const char *num){*this=num;}
	
	bign operator = (const int num){
		char s[30010];
		sprintf(s,"%d",num);
		*this=s;
		return *this;
	}
	void clean(){
		while(len>1&&!s[len-1]) len--;
	}
	bign operator = (const char *num){
		memset(s,0,sizeof(s));
		len=strlen(num);
		for(int i=0;i<len;i++){
			if(isdigit(num[len-i-1])) s[i]=num[len-i-1]-'0';
			else s[i]=num[len-i-1]-'A'+10;
		}
		clean();
		return *this;
	}
	bign operator + (const bign &b) const{
		bign c;
		c.len=max(len,b.len);
		for(int i=0;i<=c.len;i++){
			c.s[i]+=s[i]+b.s[i];
			c.s[i+1]+=c.s[i]/10;
			c.s[i]%=10;
		}
		if(c.s[c.len]) c.len++;
		c.clean();
		return c;
	}
	bign operator += (const bign &b){
		*this=*this+b;
		return *this;
	}
	bign operator * (const bign &b){
		bign c;
		c.len=len+b.len;
		for(int i=0;i<len;i++){
			for(int j=0;j<b.len;j++){
				c.s[i+j]+=s[i]*b.s[j];
			}
		}
		for(int i=0;i<c.len;i++){
			c.s[i+1]+=c.s[i]/10;
			c.s[i]%=10;
		}
		c.clean();
		return c;
	}
	bign operator *= (const bign &b){
		*this =*this*b;
		return *this;
	}
	bign operator - (const bign &b){
		bign c;
		c.len=0;
		for(int i=0,g=0;i<len;i++){
			int x=s[i]-g;
			if(i<b.len) x-=b.s[i];
			if(x>=0) g=0;
			else{g=1; x+=10;}
			c.s[c.len++]=x;
		}
		c.clean();
		return c;
	}
	bign operator -= (const bign &b){
		*this=*this-b;
		return *this;
	}
	bign operator / (const int &b){
		int f=0;
		bign c;
		for(int i=len-1;i>=0;i--){
			f=f*10+s[i];
			c.s[i]=f/b;
			f%=b;
		}
		c.len=len;
		c.clean();
		return c;
	}
	bign operator / (const bign &b){
		bign c,f=0;
		for(int i=len-1;i>=0;i--){
			f=f*10;
			f.s[0]=s[i];
			while(f>b||f==b){
				f-=b;
				c.s[i]++;
			}
		}
		c.len=len;
		c.clean();
		return c;
	}
	bign operator /= (const bign &b){
		*this=*this/b;
		return *this;
	}
	bign operator % (const bign &b){
		bign r=*this/b;
		r=*this-r*b;
		return r;
	}
	bign operator %= (const bign &b){
		*this=*this%b;
		return *this;
	}
	bool operator < (const bign &b){
		if(len!=b.len) return len<b.len;
		for(int i=len-1;i>=0;i--){
			if(s[i]!=b.s[i]) return s[i]<b.s[i];
		}
		return false;
	}
	bool operator > (const bign &b){
		if(len!=b.len) return len>b.len;
		for(int i=len-1;i>=0;i--){
			if(s[i]!=b.s[i]) return s[i]>b.s[i];
		}
		return false;
	}
	bool operator == (const bign &b){
		return !(*this>b)&&!(*this<b);
	}
	string str() const{
		string res="";
		for(int i=0;i<len;i++){
			if(s[i]<10) res=char(s[i]+'0')+res;
			else res=char(s[i]+'A'-10)+res;
		}
		return res;
	}
}a,b,c;

int n,ka,kb;
unsigned long long ans,cnt,l=1;
struct chen{
	int a;
	int b;
	bool friend operator < (chen x,chen y){
		return (x.a*x.b)<(y.a*y.b);
	}
}peo[maxn];

int main(){
	cin>>n;
	cin>>ka>>kb;
	peo[0].a=ka,peo[0].b=kb;
	for(int i=1;i<=n;i++) cin>>peo[i].a>>peo[i].b;
	sort(peo+1,peo+n+1);
//	for(int i=0;i<=n;i++){
//		cnt=l/peo[i].b;
//		l=l*peo[i].a;
//		ans=max(ans,cnt);
//	}
	bign m=peo[0].a,ans=0;
	for(int i=1;i<=n;i++){
		bign tmp=(m/peo[i].b);
		if(tmp>ans) ans=tmp;
		m*=bign(peo[i].a);
	}
	cout<<ans.str()<<endl;
	return 0;
} 
原文地址:https://www.cnblogs.com/DReamLion/p/14501008.html