zoukankan      html  css  js  c++  java
  • 高精度

    模板

    搬自这位神仙的博客

    /*高精板子*/
    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;
    } 
    
  • 相关阅读:
    C语言I作业12—学期总结
    # 第一周作业
    C语言Ⅰ博客作业11
    C语言Ⅰ博客作业10
    C语言Ⅰ博客作业09
    C语言Ⅰ博客作业08
    C语言||作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
  • 原文地址:https://www.cnblogs.com/DReamLion/p/14501008.html
Copyright © 2011-2022 走看看