#include<bits/stdc++.h>
using namespace std;
/*C++ BigInteger*/
struct BigInteger{
static const int BASE = 100000000;//static修饰符声明静态成员变量,BigInteger成员函数可以直接使用,其他地方需要BigInteger::BASE
static const int WIDTH = 8;
vector<int> s;

BigInteger(long long num = 0){ *this=num;}//构造函数
/*赋值运算符重载*/
BigInteger operator = (const string& str){//lrj采用的是每个元素存八位以节省空间
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);//将字符串转化为八位整数存入x
s.push_back(x);
}
return *this;
}
BigInteger operator = (long long num){//位数不足的用long long存储
s.clear();
do{
s.push_back(num%BASE);
num /= BASE;
}while(num>0);
return *this;
}
/*流输出重载*/
friend ostream& operator << (ostream &out, const BigInteger& x);
/*流输入重载*/
friend istream& operator >> (ostream &in, const BigInteger& x);
/*比较运算符重载*/
bool operator < (const BigInteger& 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.size())return s[i] < b.s[i];
return false;
}
bool operator > (const BigInteger& b) const{return b < *this;}
bool operator <= (const BigInteger& b) const{return !(b < *this);}
bool operator >= (const BigInteger& b) const{return !(*this < b);}
bool operator != (const BigInteger& b) const{return b < *this||*this < b;}
bool operator == (const BigInteger& b) const{return !(b < *this)&&!(*this < b);}
/*加法运算符重载*/
BigInteger operator + (const BigInteger& b){
BigInteger 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;
}
/*减法运算符重载*/
BigInteger operator - (const BigInteger& b){
BigInteger c;
c.s.clear();
for(int i=0;;i++){
if(i>=s.size()&&i>=b.s.size())break;
if(s[i]>b.s[i]){//判断是否需要借位
int x=s[i]-b.s[i];
c.s.push_back(x);
}else{
int x=BASE+s[i]-b.s[i];
c.s.push_back(x);
int k=i+1;
while(!s[k]){//如需借位,判断是否需要进一步借位
s[k]=BASE-1;
k++;
}
s[k]--;
}
}
return c;
}
/*乘法运算符重载*/
BigInteger operator * (const BigInteger& b){
BigInteger c;
c.s.clear();
if(b==0||s.empty()){c.s.push_back(0);return c;}//判断是否乘零
for(int i=0;;i++){
long long g=0;
if(g==0&&(i>=s.size()||i>=b.s.size()))break;
long long x;
if(!s[i]||!b.s[i]){//判断该位是否乘0
c.s.push_back(g%BASE);
g/=BASE;
}else{
x=s[i]*b.s[i]+g;
c.s.push_back(x%BASE);
g=x/BASE;
}
}
return c;
}
/*除法运算符重载*/
BigInteger operator / (const BigInteger&b){
BigInteger k;
for(int i=0;i<s.size();i++){
k.s[i]=s[i];
}
BigInteger c;
c.s.clear();
if(b==0){cout<<"error,divisor can not be zero";return 0;}//非法运算判断
if(s.size()<b.s.size()){
c.s.push_back(0);
return c;
}
int num=0;
while(k>=b){//F1@g太弱了只能想到用减法实现除法了
k-=b;
num++;
}
c.s.push_back(num);
return c;
}
/*取余运算符重载*/
BigInteger operator % (const BigInteger&b){//F1@g太弱了只能想到用减法实现取余了
BigInteger k;
for(int i=0;i<s.size();i++){
k.s[i]=s[i];
}
if(k<b)return k;
while(k>=b)k-=b;
return k;
}
/*双目运算符重载*/
BigInteger operator += (const BigInteger& b){*this = *this+b;return *this;}
BigInteger operator -= (const BigInteger& b){*this = *this-b;return *this;}
BigInteger operator *= (const BigInteger& b){*this = *this*b;return *this;}
BigInteger operator /= (const BigInteger& b){*this = *this/b;return *this;}
BigInteger operator %= (const BigInteger& b){*this = *this%b;return *this;}
/*自增运算符重载*/
BigInteger& operator ++ (){//++在前面
s[0]++;
for(int i=0;;i++){
if(s[i]<BASE)break;
s[i]=0;
s[i+1]++;
}
}
BigInteger operator ++ (int){//++在后面
s[0]++;
for(int i=0;;i++){
if(s[i]<BASE)break;
s[i]=0;
s[i+1]++;
}
}
/*自减运算符重载*/
BigInteger& operator -- (){//--在前面
for(int i=0;;i++){
if(!s[i]){s[i]--;break;}
s[i]=BASE-1;
}
}
BigInteger operator -- (int){//--在后面
for(int i=0;;i++){
if(!s[i]){s[i]--;break;}
s[i]=BASE-1;
}
}
/*位运算什么的,F1@g连int都没弄明白,就没写2333,留坑日后填吧*/
};
/*流输出重载*/
ostream& operator << (ostream &out, const BigInteger& 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, BigInteger& x){
string s;
if(!(in >> s)) return in;
x = s;
return in;
}

参考:C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)


人们还能笑的时候,是不容易被打败的。