高精模板

来源:互联网 发布:centos 7 和6的阿帕奇 编辑:程序博客网 时间:2024/06/05 19:32
自己写的高精模板。
测试过这些题:
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 10000int 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只能为1struct 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]);    }};


0 0