高精度(从简版)

来源:互联网 发布:iphone文件传输软件 编辑:程序博客网 时间:2024/04/30 17:45

前言

高精度想必大家再熟悉不过了,这里我就不再赘述它的原理(模拟),但大部分同学的高精度用得都太零散了,蒟蒻我就将常用的运算符号用struct封装一下,请大佬们笑纳。

code

struct Big{    int num[N],len;    Big (){        memset(num,0,sizeof(num));        len=1;    }    void Rd(){        scanf("%s",A);        int sl=strlen(A);        len=0;        for(int i=sl-1,x;x=0,i>=0;num[len++]=x,i-=4){            if(i>=3)REP(j,i-3,i)x=(x<<1)+(x<<3)+(A[j]^48);            else REP(j,0,i)x=(x<<1)+(x<<3)+(A[j]^48);        }    }    void Pr(){        if(!num[len-1]){printf("0");return;}        printf("%d",num[len-1]);        DREP(i,len-2,0)printf("%04d",num[i]);    }    Big operator+(const Big &a)const{        Big b;        b.len=max(len,a.len);        REP(i,0,b.len-1){            int &B=b.num[i];            B+=num[i]+a.num[i];            if(B>=P)B-=P,b.num[i+1]++;        }        if(b.num[b.len])b.len++;        return b;    }    Big operator+(int a){        Big b;        b.len=len;        REP(i,0,len-1){            int &B=b.num[i];            B+=num[i]+a%P;            if(B>=P)b.num[i+1]++,B-=P;            a/=P;        }        if(b.num[b.len])b.len++;        return b;    }    Big operator-(const Big &a)const{        Big b;        b.len=len;        REP(i,0,len-1)b.num[i]=num[i];        REP(i,0,len-1){            b.num[i]-=a.num[i];            int now=i;            while(b.num[now]<0)b.num[now]+=P,now++,b.num[now]--;        }        while(!b.num[b.len-1])b.len--;        return b;    }    Big operator-(int a){        Big b;        b.len=len;        REP(i,0,len-1)b.num[i]=num[i];        REP(i,0,len-1){            b.num[i]-=a%P;            int now=i;            while(b.num[now]<0)b.num[now]+=P,now++,b.num[now]--;            a/=P;        }         while(!b.num[b.len-1])b.len--;        return b;    }     Big operator*(const Big &a)const{        Big b;        b.len=len+a.len-1;        REP(i,0,len-1)            REP(j,0,a.len-1){                int &B=b.num[i+j];                B+=num[i]*a.num[j];                if(B>=P)b.num[i+j+1]+=B/P,B%=P;            }        while(b.num[b.len])b.len++;        return b;    }    Big operator*(const int &a)const{        Big b;        REP(i,0,len-1){            int &B=b.num[i];            B+=num[i]*a;            if(B>=P)b.num[i+1]+=B/P,B%=P;        }        if(b.num[b.len])b.len++;        return b;    }    Big operator/(const int &a)const{        Big b;        REP(i,0,len-1)b.num[i]=num[i];        DREP(i,len-1,1)b.num[i-1]+=b.num[i]%a*P,b.num[i]/=a;        b.num[0]/=a;        b.len=len;        while(b.len>1 && !b.num[b.len-1])b.len--;        return b;    }};

小结:
高精度的用处还是很大的吧…