高精度模板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;
}
本文介绍了一个高精度模板3.0,该模板支持除除法及取模运算外的所有基本算术运算,并实现了大小比较功能。通过使用C++中的向量容器,此模板能够高效地处理大整数的加减乘等操作。
115

被折叠的 条评论
为什么被折叠?



