zoukankan      html  css  js  c++  java
  • 高精度板子(阉割)

    只含加减乘,<,(leq),勉强能用,低精构造即可。

    namespace clockwhite{
    	const int MLen=1001,P=10000;
    	char ch[MLen<<2];
    	struct Big{
    		int S[MLen];
    		bool fu;
    		inline void init(){memset(S,0,sizeof(S));S[0]=0;fu=0;}
    		int& operator [](int k){return S[k];}
    		Big(){init();}
    		Big(int k){
    			init();
    			if(k<0)fu=1,k=-k;else fu=0;
    			while(k)S[++S[0]]=k%P,k/=P;
    			if(!S[0])S[0]=1;
    		}
    		bool operator < (Big b){
    			bool res=0;
    			if(fu^b.fu)return fu;
    			if(fu&&b.fu)res=1;
    			if(S[0]!=b[0])return (S[0]<b[0])^res;
    			for(int i=S[0];i;--i)
    				if(S[i]!=b[i])return (S[i]<b[i])^res;
    			return false;
    		}
    		bool operator == (Big b){
    			if(fu!=b.fu||S[0]!=b[0])return 0;
    			for(int i=S[0];i;--i)if(S[i]!=b[i])return 0;
    			return 1;
    		}
    		bool operator <= (Big b){return *this<b||*this==b;}
    		bool operator != (Big b){return !(*this==b);}
    		Big operator + (Big b)const{
    			Big a=*this,ans;ans.init();
    			if(a.fu&&b.fu){
    				a.fu=b.fu=0;ans=a+b;
    				if(ans[1]!=0||ans[0]!=1)ans.fu=1;
    				return ans;
    			}
    			if(a.fu&&!b.fu){a.fu=0;return b-a;}
    			if(!a.fu&&b.fu){b.fu=0;return a-b;}
    			a[0]=max(a[0],b[0]);
    			for(int i=1;i<=a[0];++i)a[i+1]+=(a[i]+b[i])/P,a[i]=(a[i]+b[i])%P;
    			if(a[a[0]+1])++a[0];
    			return a;
    		}
    		Big operator -(Big b)const{
    			Big ans,a=*this;ans.init();
    			if(a.fu&&!b.fu){
    				a.fu=b.fu=0;ans=a+b;
    				if(ans[1]!=0||ans[0]!=1)ans.fu=1;
    				return ans;
    			}
    			if(a.fu&&b.fu){a.fu=b.fu=0;return b-a;}
    			if(!a.fu&&b.fu){b.fu=0;return a+b;}
    			if(a<b)swap(a,b),a.fu=1;
    			else a.fu=0;
    			for(int i=1;i<=a[0];++i){
    				if(a[i]<b[i])a[i]+=P,--a[i+1];
    				a[i]-=b[i];
    			}
    			while(!a[a[0]]&&a[0]>1)--a[0];
    			if(a[0]==1&&a[1]==0)a.fu=0;
    			return a;
    		}
    		Big operator * (Big b)const{
    			Big ans,a=*this;ans.init();
    			ans[0]=a[0]+b[0]-1;
    			for(int i=1;i<=a[0];++i)
    				for(int j=1;j<=b[0];++j){
    					ans[i+j-1]+=a[i]*b[j];
    					ans[i+j]+=ans[i+j-1]/P;
    					ans[i+j-1]%=P;
    				}
    			if(ans[ans[0]+1])++ans[0];
    			while(!ans[ans[0]]&&ans[0]>1)--ans[0];
    			ans.fu=a.fu^b.fu;
    			if(ans[0]==1&&ans[1]==0)ans.fu=0;
    			return ans;
    		}
    		inline void sc(){
    			scanf("%s",ch);init();S[0]=1;
    			int pow=1,t=1,len=strlen(ch),stop=0;
    			if(ch[0]=='-')fu=1,stop=1;
    			for(int i=len-1;i>=stop;--i){
    				if(t>4)t=pow=1,++S[0];
    				S[S[0]]+=pow*(ch[i]-'0');
    				++t,pow=(pow<<3)+(pow<<1);
    			}
    		}
    		inline void pr(){
    			if(fu)printf("-");
    			printf("%d",S[S[0]]);
    			for(int i=S[0]-1;i;--i){
    				if(S[i]<10)putchar('0');
    				if(S[i]<100)putchar('0');
    				if(S[i]<1000)putchar('0');
    				printf("%d",S[i]);
    			}
    		}
    	};
    }
    
  • 相关阅读:
    kubernetes 二进制安装v2
    Istio
    linux的history指令显示时间
    echarts折线图y轴刻度值按照某个值的倍数
    ubuntu下tesseract 4.0安装及参数使用
    chrome 浏览器下载大文件断掉的问题
    强化学习
    第十一篇 -- 2020总结以及2021期待
    字符串时间yyyyMMddHHmmss转成yyyy-MM-dd HH-mm-ss字符串格式
    windows安装mongodb,密码访问
  • 原文地址:https://www.cnblogs.com/clockwhite/p/13687429.html
Copyright © 2011-2022 走看看