C++大数模版

class Bignum{
    private:
        vector<int>a;
        void clear(){a.resize(1);a[0]=0;}
        void set(int n){
            if(clear(),n){            
                int t;a.clear();
                while(n)a.push_back(n-(t=n/10000)*10000),n=t;
            }
        }
        void set(long long n){
            if(clear(),n){            
                long long t;a.clear();
                while(n)a.push_back(n-(t=n/10000)*10000),n=t;
            }
        }
        void clearzero(){
            int l=a.size();
            while(l>1 && a[l-1]==0)l--;
            a.resize(l);
        }
        void set(char*st){
            char c;vector<int> s;a.clear();
            while(((c=*(st++))<'0' || c>'9'));s.push_back(c-'0');
            while((c=*(st++))>='0'&&c<='9')s.push_back(c-'0');          
            int l=s.size();
            for (int i=l-1;i-3>=0;i-=4)a.push_back(s[i]+s[i-1]*10+s[i-2]*100+s[i-3]*1000);
            if(l&3){
                int tmp=0;
                for (int i=0;i<(l&3);i++)tmp=tmp*10+s[i];
                a.push_back(tmp);
            }
            clearzero();
        }
    public:
        Bignum(){clear();}
        Bignum(int n){set(n);}
        Bignum(long long n){set(n);}
        Bignum(char*s){set(s);}
        Bignum& operator=(int a){set(a);return *this;}
        Bignum& operator=(long long a){set(a);return *this;}
        Bignum& operator=(char *s){set(s);return *this;}
        int size()const{
            if(a.back()>=1000)return a.size()<<2;
            else if(a.back()>=100)return (a.size()<<2)-1;
            else if(a.back()>=10)return (a.size()<<2)-2;
            else return (a.size()<<2)-3;
        }
        long long toint()const{
            long long ans=0;
            for (int i=int(a.size())-1;i>=0;i--)ans=ans*10000+a[i];
            return ans;
        }
        int tostr(char *s)const{
            int tot=0;
            for (unsigned int i=0;i<a.size();i++)
                if(i+1==a.size()){
                    int x=a[i];
                    while(x)s[tot++]='0'+x%10,x/=10;
                }else{
                    int x=a[i];
                    for (int j=0;j<4;j++)s[tot++]='0'+x%10,x/=10;
                }
            if(tot==0)s[tot++]='0';
            for (int i=0,j=tot-1;i<j;i++,j--)swap(s[i],s[j]);
            s[tot]=0;
            return tot;
        }
        int toarr(int *s)const{
            int tot=0;
            for (unsigned int i=0;i<a.size();i++)
                if(i+1==a.size()){
                    int x=a[i];
                    while(x)s[tot++]=x%10,x/=10;
                }else{
                    int x=a[i];
                    for (int j=0;j<4;j++)s[tot++]=x%10,x/=10;
                }
            if(tot==0)s[tot++]=0;
            return tot;
        }
        int comp(const Bignum&x)const{
            if(a.size()<x.a.size())return 1;
            if(a.size()>x.a.size())return -1;
            for (int i=a.size()-1;i>=0;i--)
                if(a[i]<x.a[i])return 1;
                else if(a[i]>x.a[i])return -1;
            return 0;
        }
        bool operator<(const Bignum&x)const{return comp(x)==1;}
        bool operator>(const Bignum&x)const{return comp(x)==-1;}
        bool operator<=(const Bignum&x)const{return comp(x)!=-1;}
        bool operator>=(const Bignum&x)const{return comp(x)!=1;}
        bool operator!=(const Bignum&x)const{return comp(x)!=0;}
        bool operator==(const Bignum&x)const{return comp(x)==0;}    
        Bignum& operator+=(const Bignum&x){
            int l=max(a.size(),x.a.size())+1;
            a.resize(l);
            for (unsigned int i=0;i<x.a.size();i++)a[i]+=x.a[i];
            for (int i=0;i<l;i++)if(a[i]>=10000)a[i]-=10000,a[i+1]++;
            clearzero();return *this;
        }
        Bignum& operator-=(const Bignum&x){
            for (unsigned int i=0;i<x.a.size();i++)a[i]-=x.a[i];
            for (unsigned int i=0;i<a.size();i++)if(a[i]<0)a[i]+=10000,a[i+1]--;
            clearzero();return *this;
        }
        Bignum operator+(const Bignum&x)const{Bignum y=*this;y+=x;return y;}        
        Bignum operator-(const Bignum&x)const{Bignum y=*this;y-=x;return y;}        
        Bignum operator*(const Bignum&x)const{
            int l=a.size()+x.a.size();
            Bignum z;z.a.clear();
            vector<long long>tmp;tmp.resize(l);
            for (unsigned int i=0;i<x.a.size();i++)
                for (unsigned int j=0;j<a.size();j++)
                    tmp[i+j]+=x.a[i]*a[j];
            for (int i=0;i<l;i++){
                long long t=tmp[i]/10000;
                z.a.push_back(int(tmp[i]-t*10000));
                t?tmp[i+1]+=t:0;
            }
            z.clearzero();return z;
        }
        Bignum operator*(long long x)const{
            if(x>=10000)return *this * Bignum(x);
            int l=a.size()+2;
            Bignum z;z.a.resize(l);
            for (unsigned int i=0;i<a.size();i++)z.a[i]=a[i]*x;
            for (int i=0,t;i<l;i++)z.a[i+1]+=(t=z.a[i]/10000),z.a[i]-=t*10000;
            z.clearzero();return z;
        }
        friend Bignum operator*(long long x,const Bignum&a){return a*x;}
        Bignum& operator*=(long long x){return *this=*this*x;}
        Bignum& operator*=(const Bignum&x){return *this=*this*x;}        
        Bignum operator/(const Bignum &x)const{
            Bignum b=*this,q,tmp;q.a.resize(b.a.size());    
            for(int i=int(b.a.size())-int(x.a.size());b>=x;i--,b.clearzero()){
                tmp.a.assign(b.a.begin()+i,b.a.end());                
                int l=0,r=10000-1,m;
                while(l<=r){
                    m=(l+r)>>1;
                    if(x*m<=tmp)l=m+1;
                    else r=m-1;
                }
                for (unsigned int j=0;j<tmp.a.size();j++)b.a[j+i]=0;
                q.a[i]=r;tmp-=x*r;
                for (unsigned int j=0;j<tmp.a.size();j++)b.a[j+i]=tmp.a[j];
            }
            q.clearzero();return q;
        }
        Bignum operator%(const Bignum &x)const{return *this-*this/x*x;}
        Bignum& operator/=(const Bignum &x){return *this=*this/x;}
        Bignum& operator%=(const Bignum &x){return *this=*this%x;}

        Bignum& operator/=(long long x){
            if(x>=10000)return *this/=Bignum(x);
            else{
                for (int i=int(a.size())-1;i>=0;i--){
                    int t=a[i]/x;
                    if(i)a[i-1]+=(a[i]-t*x)*10000;
                    a[i]=t;
                }
                clearzero();
                return *this;
            }
        }
        Bignum operator/(long long x)const{
            if(x>=10000)return *this / Bignum(x);
            else{
                Bignum y=*this;y/=x;return y;
            }
        }
        long long operator%(long long x)const{
            if(x>=10000)return (*this%Bignum(x)).toint();
            else{
                long long ans=0;
                for (int i=int(a.size())-1;i>=0;i--)ans=(ans*10000+a[i])%x;
                return ans;
            }
        }
        int operator%(int x)const{
            return int(operator%((long long)x));
        }
        Bignum& operator%=(long long x){
            if(x>=10000)return *this%=Bignum(x);
            else return *this=*this%x;
        }
        int to2(int *s)const{
            int tot=0;
            vector<unsigned long long>t;
            for (unsigned int i=0;i<a.size();i++)t.push_back((unsigned long long)a[i]);
            while(!t.empty()){
                for (int i=int(t.size())-1;i>=0;i--){
                    unsigned long long r=t[i]>>32;
                    if(i==0){
                        s[tot++]=int(t[i]&0xffffffff);
                    }else{
                        t[i-1]+=(t[i]&((unsigned long long)0xffffffff))*10000;
                    }
                    t[i]=r;
                }
                while(!t.empty() && t.back()==0)t.pop_back();
            }
            return tot;
        }
        bool input(){
            char c;vector<int> s;a.clear();
            while(((c=getchar())<'0' || c>'9') && c!=EOF);
            if(c==EOF){a.push_back(0);return 0;}
            s.push_back(c-'0');
            while((c=getchar())>='0'&&c<='9')s.push_back(c-'0');          
            int l=s.size();
            for (int i=l-1;i-3>=0;i-=4)a.push_back(s[i]+s[i-1]*10+s[i-2]*100+s[i-3]*1000);
            if(l&3){
                int tmp=0;
                for (int i=0;i<(l&3);i++)tmp=tmp*10+s[i];
                a.push_back(tmp);
            }
            clearzero();
            return 1;
        }
        void output()const{
            for (int i=int(a.size())-1;i>=0;i--)
                if(i==int(a.size())-1)printf("%d",a[i]);
                else printf("%04d",a[i]);
        }
        void outputln()const{
            output();putchar('\n');
        }
        friend Bignum max(const Bignum &a,const Bignum &b){return a>b?a:b;}
        friend Bignum min(const Bignum &a,const Bignum &b){return a<b?a:b;}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值