压位高精度

前言

俗话说得好,强龙难压地头蛇,怎样才能压高精的风气呢

之前有同学说我的高精度会超,于是我抄了老师的代码我又写了个压位高精

高精已经够了,为何还要压位高精?

胖友啊,你是不是好久没刷题,忘了残忍的TLE,压位高精正是因此而诞生

如何制作压位高精?

首先,我要声明,我这里是压8位的,想看压9/10位的找别人,我不会

那么,压8位是什么意思呢?

压位高精中,压8位意思差不多是拿10^8进制来算

可是这样一来,不但字符不够,判断就要几万行,怎么办?

等等,你千万别忘了int,而且为什么我们要拿一个字符表示一个数?

好了,压位高精的基础普及完了

先给一下代码

之后我会慢慢讲解的

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
const long long M=1e8;
struct bigInt{
	long long x[1307],len;
	bigInt(){this->len=0;}
	void operator= (string s){
		int i=s.size()-8;
		while(i>=0)
		    this->x[this->len++]=stoi(s.substr(i,8)),i-=8;
		if(i>-8)
		    this->x[this->len++]=stoi(s.substr(0,i+8));
	}
	void input(){
		string s;
		cin>>s;
		int i=s.size()-8;
		while(i>=0)
		    this->x[this->len++]=stoi(s.substr(i,8)),i-=8;
		if(i>-8)
		    this->x[this->len++]=stoi(s.substr(0,i+8));
	}
	void print(){
		printf("%lld",this->x[this->len-1]);
		for(int i=this->len-2;i>=0;--i)
		    printf("%08lld",this->x[i]);
	}
	bigInt operator-(bigInt &b){
		bigInt ans=*this;
		for(int i=0;i<ans.len;i++){
			ans.x[i]-=b.x[i];
			if(ans.x[i]<0)
			    ans.x[i]+=M,--ans.x[i+1];
		}
		while(ans.len>1&&!ans.x[ans.len-1])
		    ans.len--;
		return ans;
	}
	bigInt operator+(bigInt &b){
		bigInt ans=*this;
		ans.len=max(ans.len,b.len)+1;
		for(int i=0;i<ans.len;i++){
			ans.x[i]+=b.x[i];
			if(ans.x[i]>=M)
			    ans.x[i]-=M,++ans.x[i+1];
		}
		while(ans.len>1&&!ans.x[ans.len-1])
		    ans.len--;
		return ans;
	}
	bigInt operator* (const bigInt &b){
		bigInt ans;
		ans.len=this->len+b.len;
		for(int i=0;i<ans.len;i++)
		    ans.x[i]=0;
		for(int i=0;i<this->len;i++)
		    for(int j=0;j<b.len;j++){
		    	ans.x[i+j]+=this->x[i]*b.x[j]; 
		    	ans.x[i+j+1]+=ans.x[i+j]/M;
		    	ans.x[i+j]%=M;
			}
		while(ans.len>1&&!ans.x[ans.len-1])
		    ans.len--;
		return ans;
	}
	bigInt chuer(){
		long long r=0;
		bigInt ans=*this;
		for(int i=ans.len-1;i>=0;i--){
			ans.x[i]=(this->x[i]+r*M)/2;
			r=(this->x[i]+r*M)%2; 
		}
		while(ans.len>1&&!ans.x[ans.len-1])
		    ans.len--;
		return ans;
	}
	bool operator>(bigInt &b){
		if(this->len!=b.len)
		    return (this->len>b.len);
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return this->x[i]>b.x[i];
		return false;
	}
	bool operator<(bigInt &b){
		if(this->len!=b.len)
		    return this->len<b.len;
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return this->x[i]<b.x[i];
		return false;
	}
	bool operator>=(bigInt &b){
		if(this->len!=b.len)
		    return this->len>b.len;
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return this->x[i]>b.x[i];
		return true;
	}
	bool operator<=(bigInt &b){
		if(this->len!=b.len)
		    return this->len<b.len;
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return this->x[i]<b.x[i];
		return true;
	}
	bool operator==(bigInt &b){
		if(this->len!=b.len)
		    return false;
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return false;
		return true;
	}
	bool operator!=(bigInt &b){
		if(this->len!=b.len)
		    return true;
		for(int i=len-1;i>=0;i--)
		    if(this->x[i]!=b.x[i])
		        return true;
		return false;
	}
	bool even(){
		return !(this->x[0]&1);
	}
	bigInt operator%(bigInt x){
		bigInt ans=*this;
	    while(ans>=x)
	        ans=ans-x;
	    return ans;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值