高精度模板3.0

高精度模板3.0,支持正整数除除法及取模运算外的所有基本运算以及大小比较,乘法经过改进后基本没有问题
#include<cstdio>     
#include<iostream>     
#include<vector>      
#include<cstring>
#define LL long long     
using namespace std;     
struct bigint{     
    static const int base=1000000000;     
    static const int width=9;     
    vector<LL>s;     
    bigint (LL num=0){*this=num;}     
    bigint operator = (LL num){     
        s.clear();     
        do{     
            s.push_back(num%base);     
            num/=base;     
        }while(num>0);     
        return *this;     
    }     
    bigint operator = (const string& str){     
        s.clear();     
        int x,len=(str.length()-1)/width+1;     
        for(int i=0;i<len;i++){     
            int end=str.length()-i*width;     
            int start=max(0,end-width);     
            sscanf(str.substr(start,end-start).c_str(),"%d",&x);     
            s.push_back(x);     
        }     
        return *this;     
    }     
    bigint operator + (const bigint& b) const{     
        bigint c;     
        c.s.clear();     
        for(int i=0,g=0;;i++){     
            if(g==0&&i>=s.size()&&i>=b.s.size())break;     
            int x=g;     
            if(i<s.size())x+=s[i];     
            if(i<b.s.size())x+=b.s[i];     
            c.s.push_back(x%base);     
            g=x/base;     
        }     
        return c;     
    }     
    bigint operator - (const bigint& b) const{     
        bigint c;     
        c.s.clear();     
        for(int i=0,g=0;;i++){     
            if(g==0&&i>=s.size())break;     
            int x=g;     
            if(i<s.size())x+=s[i];     
            if(i<b.s.size())x-=b.s[i];     
            if(x<0)x+=base,g=-1;     
            else g=0;     
            c.s.push_back(x);     
        }     
        return c;     
    }  
    bigint operator * (const bigint& b) const{  
        bigint c;  
        c.s.clear();  
        LL i,j,g;  
        LL temp,temp1;  
        c.s.resize(s.size()+b.s.size());  
        for(i=0;i<s.size();i++){  
            g=0,temp1=0;  
            for(j=0;j<b.s.size();j++){  
                LL x=c.s[i+j];  
                temp=s[i]*b.s[j]+g;  
                g=temp/base;  
                x+=temp%base+temp1;  
                temp1=x/base;  
                x%=base;  
                c.s[i+j]=x;  
            }  
            if(g!=0)  
                c.s[i+j]=g;  
        }  
        if(temp1!=0)  
            c.s[i+j]=temp1;  
        while(c.s.back()==0&&c.s.size()>1)  
            c.s.pop_back();  
        return c;  
    }  
    bool operator < (const bigint&b) const{     
        if(s.size()!=b.s.size())return s.size()<b.s.size();     
        for(int i=s.size()-1;i>=0;i--)     
            if(s[i]!=b.s[i])return s[i]<b.s[i];     
        return false;     
    }     
    bool operator > (const bigint&b) const{return b<*this;}     
    bool operator <= (const bigint&b) const{return !(b<*this);}     
    bool operator >= (const bigint&b) const{return !(*this>b);}     
    bool operator != (const bigint&b) const{return b<*this|| *this<b;}     
    bool operator == (const bigint&b) const{return !(b<*this)&&!(*this<b);}
	bigint operator *= (const bigint &b){*this=(*this)*b; return *this;}     
    bigint operator -= (const bigint &b){*this=(*this)-b; return *this;}  
    bigint operator += (const bigint &b){*this=(*this)+b; return *this;}   
    bigint operator ++ (int){*this=*this+1; return *this;}   
    bigint& operator ++ () {*this=*this+1; return *this;}  
    bigint operator -- (int){*this=*this-1; return *this;}   
    bigint& operator -- (){*this=*this-1; return *this;}       
};     
ostream& operator << (ostream &out,const bigint& x){     
    out<<x.s.back();     
    for(int i=x.s.size()-2;i>=0;i--){     
        char buf[20];     
        sprintf(buf,"%09d",x.s[i]);     
        for(int j=0;j<strlen(buf);j++)out<<buf[j];         
    }     
    return out;     
}     
istream& operator >> (istream &in,bigint&x){     
    string s;     
    if(!(in>>s))return in;     
    x=s;     
    return in;     
}  
int main(){  
    bigint a,b;  
    cin>>a>>b;  
    cout<<a*b;  
}  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值