前言
俗话说得好,强龙难压地头蛇,怎样才能压高精的风气呢
之前有同学说我的高精度会超,于是我抄了老师的代码我又写了个压位高精
高精已经够了,为何还要压位高精?
胖友啊,你是不是好久没刷题,忘了残忍的,压位高精正是因此而诞生
如何制作压位高精?
首先,我要声明,我这里是压8位的,想看压9/10位的找别人,我不会
那么,压8位是什么意思呢?
压位高精中,压8位意思差不多是拿进制来算
可是这样一来,不但字符不够,判断就要几万行,怎么办?
等等,你千万别忘了,而且为什么我们要拿一个字符表示一个数?
好了,压位高精的基础普及完了
先给一下代码
之后我会慢慢讲解的
#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;
}
};