自己写的高精模板。
测试过这些题:
poj3378,poj2506,poj1001高精小数,poj1406,poj2389,poj1306,poj2325。
当然poj的坑爹数据,不保证是不是还有坑点。
不过好处是没有刻意缩行,意思比较明白,可以根据具体题目稍作修改或是扩展。
notice:
0.l保存位数,从0开始。s[maxl]保存每一位数字。
1.bsize 是一个位保存的大小,一般用10000或10。
bbit 对应为4或1。
bsav[]是做除法用的。
2.除法是-1000、-100、-10、-1倍这样来做的,复杂度还可以接受吧,最多是O(l1*l2*40)。
3.高精除int,高精乘int或longlong要注意溢出,不行就转为高精再做。
4.高精小数为了方便写,只写了一位的。bbit要设为1,bsize设为10。
看得顺眼的童鞋就拿去用吧~
测试过这些题:
poj3378,poj2506,poj1001高精小数,poj1406,poj2389,poj1306,poj2325。
当然poj的坑爹数据,不保证是不是还有坑点。
不过好处是没有刻意缩行,意思比较明白,可以根据具体题目稍作修改或是扩展。
notice:
0.l保存位数,从0开始。s[maxl]保存每一位数字。
1.bsize 是一个位保存的大小,一般用10000或10。
bbit 对应为4或1。
bsav[]是做除法用的。
2.除法是-1000、-100、-10、-1倍这样来做的,复杂度还可以接受吧,最多是O(l1*l2*40)。
3.高精除int,高精乘int或longlong要注意溢出,不行就转为高精再做。
4.高精小数为了方便写,只写了一位的。bbit要设为1,bsize设为10。
看得顺眼的童鞋就拿去用吧~
#define maxl 260
#define bbit 4
#define bsize 10000
int bsav[10]={1,10,100,1000};
struct bign{
int l,s[maxl];
bign(){l=0;memset(s,0,sizeof(s));}
void init(){l=0;memset(s,0,sizeof(s));}
bign operator =(int a){
this->init();
while(a){s[l++]=a%bsize;a=a/bsize;}
while(l&&s[l]==0) --l;
return *this;
}
bign operator =(long long a){
this->init();
while(a){s[l++]=a%bsize;a=a/bsize;}
while(l&&s[l]==0) --l;
return *this;
}
bign operator =(char *a){
this->init();
int tmp,i,j,tl=strlen(a);
for(i=tl-1;i>=bbit;i-=bbit){
tmp=0;
for(j=bbit-1;j>=0;--j){
tmp=tmp*10+a[i-j]-'0';
}
s[l++]=tmp;
}
tmp=0;
for(j=0;j<=i;++j){
tmp=tmp*10+a[j]-'0';
}
s[l++]=tmp;
while(l&&s[l]==0) --l;
return *this;
}
bool operator ==(bign b){
if (l!=b.l) return false;
for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return false;
return true;
}
bool operator <(bign b){
if (l!=b.l) return l<b.l;
for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return s[i]<b.s[i];
return false;
}
bool operator !=(bign b){return !(*this==b);}
bool operator <=(bign b){return *this<b||*this==b;}
bool operator > (bign b){return b<*this;}
bool operator >=(bign b){return b<*this||*this==b;}
bign operator +(bign b){
bign r;
r.l=l>b.l?l:b.l;
int i,c=0;
for(i=0;i<=r.l;++i){
r.s[i]=s[i]+b.s[i]+c;
c=r.s[i]/bsize;
r.s[i]%=bsize;
}
if (c) r.s[++r.l]=c;
return r;
}
bign operator +(int b){bign r;r=b;return *this+r;}
bign operator +=(bign b){return *this=*this+b;}
bign operator +=(int b){return *this=*this+b;}
bign operator -(bign b){
bign r;
r.l=l;
int i,c=0;
for(i=0;i<=l;++i){
r.s[i]=s[i]-b.s[i]+c;
if (r.s[i]<0) {c=-1;r.s[i]+=bsize;}
else c=0;
}
while(r.l&&r.s[r.l]==0) --r.l;
return r;
}
bign operator -(int b){bign r;r=b;return *this-r;}
bign operator -=(bign b){return *this=*this-b;}
bign operator -=(int b){return *this=*this-b;}
bign operator *(bign b){
bign r;
int i,j;
for(i=0;i<=l;++i){
for(j=0;j<=b.l;++j){
r.s[i+j]+=s[i]*b.s[j];
if (r.s[i+j]>=bsize)
{r.s[i+j+1]+=r.s[i+j]/bsize;r.s[i+j]%=bsize;}
}
}
r.l=l+b.l+1;
while(r.l&&r.s[r.l]==0) --r.l;
return r;
}
bign operator *(long long b){//caution for long long overflow
bign r;
int i;
long long t=0;
for(i=0;i<=l;++i){
t+=s[i]*b;
r.s[i]=t%bsize;
t=t/bsize;
}
r.l=l;
while(t){r.s[++r.l]=t%bsize;t=t/bsize;}
while(r.l&&r.s[r.l]==0) --r.l;
return r;
}
bign operator *=(bign b){return *this=*this*b;}
bign operator *=(long long b){return *this=*this*b;}
void shlnadd(int val){
for(int i=l;i>=0;--i){s[i+1]=s[i];}
s[0]=val;
++l;
while(l&&s[l]==0) --l;
}
bign operator /(bign b){
bign r,t;
int i,j;
bign tb[bbit];
for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
for(i=l;i>=0;--i){
t.shlnadd(s[i]);
for(j=bbit-1;j>=0;--j){
while(tb[j]<=t){
t-=tb[j];
r.s[i]+=bsav[j];
}
}
}
if (l>b.l) r.l=l-b.l;
else r.l=0;
while(r.l&&r.s[r.l]==0) --r.l;
return r;
}
bign operator /(int b){ //caution for int overflow:1000*b
int i,j;
bign r;
int tb[bbit];
int t=0;
for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
for(i=l;i>=0;--i){
t=t*bsize+s[i];
for(j=bbit-1;j>=0;--j){
while(tb[j]<=t){
t-=tb[j];
r.s[i]+=bsav[j];
}
}
}
r.l=l;
while(r.l&&r.s[r.l]==0) --r.l;
return r;
}
//bign operator /(int b){bign r;r=b;return *this/r;}
bign operator /=(bign b){return *this=*this/b;}
bign operator /=(int b){return *this=*this/b;}
void print(int func){
printf("%d",s[l]);
for(int i=l-1;i>=0;--i) printf("%04d",s[i]);
if (func) puts("");
}
};
//高精小数,bbit只能为1
struct bigf{
bign num;
int pos;
bigf(){num.init();pos=0;}
bigf operator =(char *s){
int l=strlen(s);
int tmp=0;
for(int i=0;i<l;++i){
if (s[i]=='.') pos=l-1-i;
else tmp=tmp*10+s[i]-'0';
}
num=tmp;
}
bigf operator *(bigf b){
bigf ret;
ret.num=num*b.num;
ret.pos=pos+b.pos;
return ret;
}
void print(){
int i,b=pos;
for(i=0;i<pos;++i) if (num.s[i]!=0) {b=i;break;}
for(i=num.l;i>=pos;--i) printf("%d",num.s[i]);
printf(".");
for(i=pos-1;i>=b;--i) printf("%d",num.s[i]);
}
};