这次修改后的高精度模板支持了部分正整数乘法(但是有些数据有问题)
#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;
}