高精度模板2.0

来源:互联网 发布:秋冬防晒 知乎 编辑:程序博客网 时间:2024/06/15 00:42

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

#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