参考HZWER博客:http://hzwer.com/
1.高精度变量声明:
#define rad 10000
struct bint{
int v[1000],l;
};
2.高精度之间的运算
inline bint operator+(bint a,bint b){
if(a.l<b.l) swap(a,b);
int t=b.l;
for(int i=1;i<=t;i++) a.v[i]+=b.v[i];
for(int i=1;i<=t;i++)
if(a.v[i]>=rad){
if(i==a.l) a.v[i+1]=0,a.l++;
a.v[i+1]+=a.v[i]/rad;
t=max(t,i+1);
a.v[i]%=rad;
}
return a;
}
inline int operator-(bint a,bint b){
for(int i=1;i<=b.l;i++){
a.v[i]-=b.v[i];
if(a.v[i]<0) a.v[i]+=rad,a.v[i+1]--;
}
while(!a.v[a.l]&&a.l) a.l--;
return a;
}
inline bint operator*(bint a,bint b){
bint c;
for(int i=1;i<=a.l+b.l;i++) c.v[i]=0;
for(int i=1;i<=a.l;i++)
for(int j=1;j<=b.l;j++)
c.v[i+j-1]+=a.v[i]*b.v[j];
c.l=a.l+b.l;
for(int i=1;i<=c.l;i++)
if(c.v[i]>=rad){
if(i==c.l) c.l++,c.v[i+1]=c.v[i]/rad;
else c.v[i+1]+=c.v[i]/rad;
c.v[i]%=rad;
}
while(c.l>1&&!c.v[c.l]) c.l--;
return c;
}
inline bool operator>(bint a,bint b){
if(a.l>b.l)return 1;
if(a.l<b.l)return 0;
for(int i=a.l;i;i--)
if(a.v[i]>b.v[i])return 1;
else if(a.v[i]<b.v[i])return 0;
return 0;
}
inline bint operator/(bint a,int p){
for(int i=1;i<=a.l;i++){
if(a.v[i]&1)a.v[i-1]+=rad/p;
a.v[i]/=p;
}
while(!a.v[a.l]&&a.l)a.l--;
return a;
}
inline bint operator/(bint a,bint b){//二分除法(要用到bint/int和bint比较运算)
bint l,r=a;
while(r>l){
bint t=r-l;
if(t.l==1&&t.v[1]==1)break;
bint mid=(l+r)/2;
if(mid*b>a)r=mid;
else l=mid;
}
if(r*b>a)return l;
else return r;
}
inline bint operator^(bint a,int p){//高精快速幂
bint c;
c.l=1,c.v[1]=1;
for(int i=p;i;i>>=1,a=a*a)
if(i&1) c=c*a;
return c;
}
inline int operator %(bint a,int m){//高精度取模
int result=0;
for(int i=1;i<=a.l;i++){
result=(result*rad+a.v[i])%m;
}
return result;
}
inline bint operator-(bint a,int p){
bint b;
b.v[1]=p;b.l=1;
return a-b;
}
inline bint operator*(bint a,int p){
bint b;
b.v[1]=p;b.l=1;
return a*b;
}
inline bint operator+(bint a,int p){
bint b;
b.v[1]=p;b.l=1;
return a+b;
}
inline bint operator/(bint a,int p){
for(int i=1;i<=a.l;i++){
if(a.v[i]&1)a.v[i-1]+=rad/p;
a.v[i]/=p;
}
while(!a.v[a.l]&&a.l)a.l--;
return a;
}
3.高精度输出
void print(bint a){
printf("%d",a.v[a.l]);
for(int i=a.l-1;i;i--) printf("%04d",a.v[i]);
}