zoukankan      html  css  js  c++  java
  • 高精度模板

      我其实只是存个模板……
         真的只是存个模板……
         而已啦……
         支持高精度加减乘除以及快速幂……但是没有负数……(少用而且不想写……要的话自己写写符号位……)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int bi=1e4,MN=300;
    char c[1001];
    struct big{
        int a[MN];
        inline big(){
            memset(a,0,sizeof(a));
            a[0]=1;
        }
        inline void read(){
            register int i,j,k;
            memset(a,0,sizeof(a));
            scanf("%s",c);k=strlen(c);
            a[0]=(k+3)/4;
            for (i=0;i<k;i++) j=(k-i+3)/4,a[j]=a[j]*10+c[i]-48;
        }
        inline void pr(){
            register int i;
            printf("%d",a[a[0]]);
            for (i=a[0]-1;i;i--) printf("%04d",a[i]);
        }
        inline big operator =(int x){
            if (x==0){
                memset(a,0,sizeof(a));
                a[0]=1;
            }
            a[0]=0;
            while (x){
                a[0]++;
                a[a[0]]=x%bi;
                x/=bi;
            }
            if (!a[0]) a[0]=1;
        }
        inline big(int x){
            *this=x;
        }
        inline void gl(){
            while(!a[a[0]]&&a[0]>1) a[0]--;
        }
        inline void operator =(big x){
            register int i;
            a[0]=x.a[0];
            for (i=1;i<=a[0];i++) a[i]=x.a[i];
        }
        inline bool operator >(big y){
            if (a[0]!=y.a[0]) return a[0]>y.a[0];
            for (register int i=a[0];i;i--){
                if (a[i]!=y.a[i]) return a[i]>y.a[i];
            }
            return 0;
        }
        inline bool operator >=(const big y){
            if (a[0]!=y.a[0]) return a[0]>y.a[0];
            for (register int i=a[0];i;i--){
                if (a[i]!=y.a[i]) return a[i]>y.a[i];
            }
            return 1;
        }
        inline bool operator <(big y){
            if (a[0]!=y.a[0]) return a[0]<y.a[0];
            for (register int i=a[0];i;i--){
                if (a[i]!=y.a[i]) return a[i]<y.a[i];
            }
            return 0;
        }
        inline bool operator <=(big y){
            if (a[0]!=y.a[0]) return a[0]<y.a[0];
            for (register int i=a[0];i;i--){
                if (a[i]!=y.a[i]) return a[i]<y.a[i];
            }
            return 1;
        }
        inline bool operator ==(big y){
            if (a[0]!=y.a[0]) return 0;
            for (register int i=a[0];i;i--){
                if (a[i]!=y.a[i]) return 0;
            }
            return 1;
        }
        inline bool operator !=(big y){
            return !(*this==y);
        }
        inline bool operator ==(int y){
            big x=y;
            return *this==x;
        }
        inline bool operator !=(int y){
            return !(*this==y);
        }
        inline void swap(big &a,big &b){
            big x=a;a=b;b=x;
        }
        inline big operator +(big x){
            big r;
            if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0];
            for (register int i=1;i<=r.a[0];i++) r.a[i]=(i<=a[0]?a[i]:0)+(i<=x.a[0]?x.a[i]:0);
            for (register int i=1;i<=r.a[0];i++)
            if (r.a[i]>=bi){
                r.a[i]-=bi;r.a[i+1]++;
                if (i==r.a[0]) r.a[0]++;
            }
            return r;
        }
        inline big operator +(int x){
            big r;r=*this;
            r.a[1]+=x;
            for (register int i=1;i<=r.a[0];i++)
            if (r.a[i]>=bi){
                r.a[i]-=bi;r.a[i+1]++;
                if (i==r.a[0]) r.a[0]++;
            }else break;
            return r;
        }
        inline big operator -(big x){
            if (*this<x) swap(*this,x);
            register int i;
            big r;
            if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0];
            for (i=1;i<=r.a[0];i++) r.a[i]=a[i]-(i<=x.a[0]?x.a[i]:0);
            for (i=1;i<=r.a[0];i++)
            if (r.a[i]<0){
                r.a[i+1]--;r.a[i]+=bi;
            }
            r.gl();
            return r;
        }
        inline big operator -(int x){
            register int i=1;
            big r;r=*this;
            r.a[1]-=x;
            while (r.a[i]<0) r.a[i+1]--,r.a[i]+=bi,i++;
            r.gl();
            return r;
        }
        inline big operator *(big y){
            register int i,j;
            big r;r.a[0]=a[0]+y.a[0]-1;
            for (i=1;i<=a[0];i++)
            for (j=1;j<=y.a[0];j++){
                r.a[i+j-1]+=a[i]*y.a[j];
                if (r.a[i+j-1]>=bi){
                    r.a[i+j]+=r.a[i+j-1]/bi;
                    r.a[i+j-1]%=bi;
                    if (i+j-1==r.a[0]) r.a[0]++;
                }
            }
            for (i=1;i<=r.a[0];i++)
            if (r.a[i]>=bi){
                r.a[i+1]+=r.a[i]/bi;
                r.a[i]%=bi;
                if (i==r.a[0]) r.a[0]++;
            }
            return r;
        }
        inline big operator *(int y){
            register int i,j;
            big r;r.a[0]=a[0];
            for (i=1;i<=a[0];i++)
            r.a[i]=a[i]*y;
            for (i=1;i<=r.a[0];i++)
            if (r.a[i]>=bi){
                r.a[i+1]+=r.a[i]/bi;
                r.a[i]%=bi;
                if (i==r.a[0]) r.a[0]++;
            }
            return r;
        }
        inline big half(){
            register int i,j;big r=*this;
            for (i=r.a[0];i>1;i--) r.a[i-1]+=(r.a[i]%2)*bi,r.a[i]>>=1;
            r.a[1]>>=1;
            r.gl();
            return r;
        }
        inline big operator /(big y){
            register int i,j;
            big r,l,mid,rq=*this;
            r.a[0]=rq.a[0]+1;r.a[r.a[0]]=1;
            while(r>l){
                mid=(l+r+big(1)).half();
                if (mid*y<=rq) l=mid;else r=mid-big(1);
            }
            return l;
        }
        inline big operator %(big y){
            register int i,j;
            big rq=*this;
            return rq-(rq/y*y);
        }
        inline big operator ^(int y){
            big ans=1;
            big rq=*this;
            while(y){
                if (y&1) ans=ans*rq;
                y>>=1;
                rq=rq*rq;
            }
            return ans;
        }
        inline big operator ^(big y){
            big ans=1;
            big rq=*this;
            while(y!=0){
                if (y.a[1]&1) ans=ans*rq;
                y=y/2;
                rq=rq*rq;
            }
            return ans;
        }
    };
    int main(){
    }
    View Code

      这是一个int128模版,用两个unsigned long long存储

    #define ll unsigned long long
    ll M[2315];
    struct MMH{
        ll a,b;
        MMH(ll _a=0,ll _b=0):a(_a),b(_b){}
        void half(){
            b>>=1;
            if (a&1) b|=1ull<<63;
            a>>=1;
        }
        void two(){
            a<<=1;
            if (b&(1ull<<63)) a|=1;
            b<<=1;
        }
    };
    MMH operator +(const MMH &x,const MMH &y){
        MMH z;
        z.a=x.a+y.a;z.b=x.b+y.b;if (z.b<x.b||z.b<y.b) z.a++;
        return z;
    }
    MMH operator +(const MMH &x,const int &y){
        MMH z=x;
        if ((z.b+y)<z.b) z.a++;z.b+=y;
        return z;
    }
    MMH operator -(const MMH &x,const MMH &y){
        MMH z;
        z.a=x.a-y.a;z.b=x.b-y.b;if (y.b>x.b) z.a--;
        return z;
    }
    MMH operator -(const MMH &x,const int &y){
        MMH z=x;
        if (z.b<y) z.a--;z.b-=y;
        return z;
    }
    bool operator <(const MMH &x,const MMH &y){return x.a==y.a?x.b<y.b:x.a<y.a;}
    bool operator >(const MMH &x,const MMH &y){return x.a==y.a?x.b>y.b:x.a>y.a;}
    bool operator !=(const MMH &x,const MMH &y){return x.a!=y.a||x.b!=y.b;}
    bool operator ==(const MMH &x,const MMH &y){return x.a==y.a&&x.b==y.b;}
    MMH operator *(const MMH &x,const MMH &y){
        if (x.a){
            TTT++;
            SSS-=clock();
            MMH z=x,mmh=MMH(0,0),u=y;
            while (u.a|u.b){
                if (u.b&1) mmh=mmh+z;
                z.two();u.half();_mmh++;
            }
            SSS+=clock();
            return mmh;
        }
        ll s=(1ull<<32)-1;
        ll a=(x.b>>32)*(y.b>>32),_b1=(x.b&s)*(y.b>>32),b=_b1+(x.b>>32)*(y.b&s),c=(x.b&s)*(y.b&s),d;
        a+=(b<_b1)*1ull<<32;
        d=c+((b&s)<<32);a+=d<c;a+=b>>32;
        return MMH(a,d);
    }
    View Code
  • 相关阅读:
    [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
    [收藏转贴]构建RESTful风格的WCF服务
    [转贴] C/C++中动态链接库的创建和调用
    [转贴]WebService的简单实现 C++
    谷歌已经对Android的开源严防死守
    如何成为一名黑客?
    当程序员思路被打断
    编辑语言是这样的
    开发者需要掌握多少门语言?
    程序员的六大优势
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5151053.html
Copyright © 2011-2022 走看看