就算是long long(或int64)还不够怎么办?用高精度算法。自己动手丰衣足食
_int128用户狂怒
Update2020.10.29 对原代码逻辑进行升级 修改一处代码错误(除法) 并删除大量冗余代码
闲着没事, 敲了一个高精度全家桶的结构体,重定义了常用运算符 ,挺实用的
具体思路详见代码
- MAXN可改
- 常数 O(能过)
- 代码 超 短 (共3396B)
- 本代码适用于大部分高精度程序
#include<cstdio>
#include<cstring>
#define MAXN 10000
using namespace std;
struct bignum{
char num[MAXN+1];
int len;
void clean(){memset(num,0,sizeof(num));len=0;}
void print(){
bool flag=0;
for(int i=MAXN;i>=0;i--)if(flag||num[i])putchar(num[i]+48),flag=1;
}
void read(){
char tmp[MAXN+1];
memset(tmp,0,sizeof(tmp));
clean();
scanf("%s",tmp);
len=strlen(tmp);
for(int i=0,j=strlen(tmp);j;i++,j--)num[i]=tmp[j-1]-48;
}
int size(){
len=0;
bool flag=0;
for(int i=MAXN;i>=0;i--)if(flag||num[i])len++,flag=1;
return len;
}
bool operator<(bignum &b){
if(len!=b.len)return len<b.len;
for(int i=b.len;i>=0;i--)if(num[i]!=b.num[i])return num[i]<b.num[i];
return 0;
}
bool operator>(bignum &b){return b<*this;}
bool operator!=(bignum &b){return *this>b||*this<b;}
bool operator==(bignum &b){return!(*this!=b);}
bool operator<=(bignum &b){return!(*this>b);}
bool operator>=(bignum &b){return!(*this<b);}
bignum operator+(bignum &b){
static bignum ans;
ans.clean();
for(int i=0;i<MAXN+1;i++)ans.num[i]=num[i]+b.num[i];
for(int i=0;i<MAXN+1;i++)if(ans.num[i]>9)ans.num[i]-=10,ans.num[i+1]++;
return ans;
}
bignum operator-(bignum &b){
static bignum ans;
ans.clean();
for(int i=0;i<MAXN+1;i++)ans.num[i]=num[i]-b.num[i];
for(int i=0;i<MAXN+1;i++)if(ans.num[i]<0)ans.num[i]+=10,ans.num[i+1]--;
return ans;
}
bignum operator*(bignum &b){
static bignum ans;
ans.clean();
for(int i=0;i<len;i++)
for(int j=0;j<b.len;j++)
ans.num[i+j]+=num[i]*b.num[j];
for(int i=0;i<MAXN+1;i++)ans.num[i+1]+=ans.num[i]/10,ans.num[i]%=10;
ans.len=ans.size();
return ans;
}
bignum operator/(bignum &b){
static bignum ans,tmp,ten,rem;
rem=*this;
ans.clean();
ten.clean();
ten.num[1]=1,ten.len=2;
while(*this>=b&&len>0){
tmp.clean();
tmp.num[0]=1,tmp.len=1;
while(tmp.len+1+b.len<len)tmp=tmp*ten;
ans=ans+tmp,tmp=tmp*b;
for(int i=0;i<MAXN+1;i++)num[i]-=tmp.num[i];
for(int i=0;i<MAXN+1;i++)if(num[i]<0)num[i]+=10,num[i+1]--;
size();
}
*this=rem;
return ans;
}
bignum operator%(bignum &b){
static bignum ten,ans,tmp;
ans.clean();
ten.clean();
ten.num[1]=1,ten.len=2;
while(*this>b&&len>0){
tmp.clean();
tmp.num[0]=1,tmp.len=1;
while(tmp.len+1+b.len<len)tmp=tmp*ten;
tmp=tmp*b;
for(int i=0;i<MAXN+1;i++)num[i]-=tmp.num[i];
for(int i=0;i<MAXN+1;i++)if(num[i]<0)num[i]+=10,num[i+1]--;
size();
}
for(int i=0;i<MAXN+1;i++)ans.num[i]=num[i];
ans.len=len;
return ans;
}
bignum operator+=(bignum &b){*this=*this+b;}
bignum operator-=(bignum &b){*this=*this-b;}
bignum operator*=(bignum &b){*this=*this*b;}
bignum operator/=(bignum &b){*this=*this/b;}
bignum operator%=(bignum &b){*this=*this%b;}
};
int main(){
return 0;
}