是拿来给自己抄的哼
适合所有重载定义符
struct Bignum
{
int a[MAXN],len;
Bignum(){memset(a,0,sizeof(a));len=0;}
friend Bignum operator +(Bignum u1,Bignum u2)
{
Bignum ret;int len=max(u1.len,u2.len);
for(int i=1;i<=len;i++)ret.a[i]=u1.a[i]+u2.a[i];
for(int i=1;i<len;i++)ret.a[i+1]+=ret.a[i]/10,ret.a[i]%=10;
while(ret.a[len]>9)
{
ret.a[len+1]+=ret.a[len]/10;
ret.a[len]%=10;len++;
}
ret.len=len;return ret;
}
friend Bignum operator -(Bignum u1,Bignum u2)
{
Bignum ret;int len=u1.len;
for(int i=1;i<=len;i++)ret.a[i]=u1.a[i]-u2.a[i];
for(int i=1;i<=len;i++)while(ret.a[i]<0)ret.a[i]+=10,ret.a[i+1]--;
while(ret.a[len]==0&&len>1)len--;
ret.len=len;return ret;
}
friend Bignum operator *(Bignum u1,Bignum u2)
{
Bignum ret;int len=u1.len+u2.len-1;
for(int i=1;i<=u1.len;i++)
for(int j=1;j<=u2.len;j++)
ret.a[i+j-1]+=u1.a[i]*u2.a[j];
for(int i=1;i<len;i++)ret.a[i+1]+=ret.a[i]/10,ret.a[i]%=10;
while(ret.a[len]>9)
{
ret.a[len+1]+=ret.a[len]/10;
ret.a[len]%=10;len++;
}
ret.len=len;return ret;
}
friend Bignum operator /(Bignum u1,int u2)
{
Bignum ret;int lst=0;
for(int i=u1.len;i>=1;i--)
{
lst=lst*10+u1.a[i];
if(lst>=u2)ret.a[i]=lst/u2,ret.len=max(ret.len,i);
lst%=u2;
}
return ret;
}
friend bool operator <(Bignum u1,Bignum u2)
{
if(u1.len>u2.len)return false;
if(u1.len<u2.len)return true;
for(int i=u1.len;i>=1;i--)
{
if(u1.a[i]>u2.a[i])return false;
if(u1.a[i]<u2.a[i])return true;
}
return false;
}
friend bool operator ==(Bignum u1,Bignum u2)
{
if(u1.len!=u2.len)return false;
for(int i=u1.len;i>=1;i--)if(u1.a[i]!=u2.a[i])return false;
return true;
}
void print(){for(int i=len;i>=1;i--)putchar(a[i]+'0');putchar('\n');}
}A,B;
bool check(Bignum u1,Bignum u2)
{
if(u1.len<u2.len)return false;
if(u1.len>u2.len)return true;
for(int i=u1.len;i>=1;i--)
{
if(u1.a[i]>u2.a[i])return true;
if(u1.a[i]<u2.a[i])return false;
}
return true;
}