高精度模板2.0

这次修改后的高精度模板支持了部分正整数乘法(但是有些数据有问题)

#include<cstdio>   
#include<iostream>   
#include<vector>    
#include<cstring>   
using namespace std;   
struct bigint{   
    static const int base=100000000;   
    static const int width=8;   
    vector<int>s;   
    bigint (long long num=0){*this=num;}   
    bigint operator = (long long 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();
    	int i,j,g;
    	int 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++){
    			int 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);}   
    };   
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,"%08d",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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值