typedef vector<int> T;
struct BigInt
{
T V;
BigInt(T _V):V(_V){}
BigInt(const BigInt &x):V(x.V){}
BigInt(int x=-1){V.clear();if(x==-1)return;do V.push_back(x%10); while(x/=10);}
BigInt & operator=(const BigInt &x){V=x.V;return *this;}
BigInt & operator=(const T &x){V=x;return *this;}
BigInt & operator=(int x){return *this=BigInt(x);}
T::iterator begin(){return V.begin();}
T::iterator end(){return V.end();}
T::reverse_iterator rbegin(){return V.rbegin();}
T::reverse_iterator rend(){return V.rend();}
void show(){for(T::reverse_iterator it=V.rbegin();it!=V.rend();++it)putchar(*it+'0');putchar('\n');}
void push_back(const int &x){V.push_back(x);}
int size(){return V.size();}
friend BigInt operator+(BigInt,BigInt);
friend BigInt operator*(BigInt,BigInt);
friend BigInt max(BigInt,BigInt);
};
BigInt operator+(BigInt x,BigInt y)
{
T z;
int k=0;
for(int ix=0,iy=0;iy<y.size()||ix<x.size();ix++,iy++)
{
int p=k;
if(ix<x.size())p+=x.V[ix];
if(iy<y.size())p+=y.V[iy];
k=p/10;p%=10;z.push_back(p);
}
if(k)z.push_back(k);
return z;
}
BigInt operator*(BigInt x,BigInt y)
{
T z;
if(x.size()<y.size())swap(x,y);
for(int iy=0,k=0;iy<y.size();iy++,k=0)
{
for(int ix=0;ix<x.size();ix++)
{
int p=k+x.V[ix]*y.V[iy];
if(ix+iy>=z.size())k=p/10,p%=10,z.push_back(p);
else p+=z[ix+iy],k=p/10,p%=10,z[ix+iy]=p;
}
if(k)z.push_back(k);
}
return z;
}
BigInt min(BigInt x,BigInt y)
{
if(x.size()==0)return y;
if(y.size()==0)return x;
if(x.size()<y.size())return x;
if(y.size()<x.size())return y;
for(int i=x.size()-1;i>=0;i--)
{
if(x.V[i]<y.V[i])return x;
if(y.V[i]<x.V[i])return y;
}
return x;
}
使用: BigInt a,b,c; a=(int)x;b=(int)y; c=a+b;c=a*b;c=min(a,b); c.show(); //带换行的输出