高精度压位参考博客:压位
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn],b[maxn],c[maxn],s[maxn],f[maxn],s0=0,p;
void init(int a[])
{
string s;
cin>>s;
int l=s.length();
for(int i=0;i<l;i++)
{
int h=(l-i+3)/4;
a[h]=a[h]*10+s[i]-'0';
}
a[0]=(l+3)/4;
}
void mulhigh(int a[],int b[])
{
for(int i=1;i<=a[0];i++)
for(int j=1;j<=b[0];j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10000;
c[i+j-1]%=10000;
}
c[0]=a[0]+b[0];
while(c[c[0]]==0&&c[0]>0)
c[0]--;
for(int i=0;i<=c[0];i++)
a[i]=c[i];
}
void mullow(int a[],int k)
{
for(int i=1;i<=a[0];i++)
a[i]*=k;
for(int i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/10000;
a[i]%=10000;
}
while(a[a[0]+1]>0)
{
a[0]++;
a[a[0]+1]=a[a[0]]/10000;
a[a[0]]%=10000;
}
}
int comp(int a[],int b[])
{
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>=1;i--)
{
if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return -1;
}
return 0;
}
void div(int a[],int k)
{
int t=0;
for(int i=a[0];i>=1;i--)
{
t=t*10000+a[i];
a[i]=t/k;
t%=k;
}
while(a[a[0]]==0&&a[0]>0) a[0]--;
}
void minus1(int a[],int b[])
{
for(int i=1;i<=a[0];i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i+1]--;
a[i]+=10000;
}
}
while(a[a[0]]==0&&a[0]>0) a[0]--;
}
void print(int a[])
{
printf("%d",a[a[0]]);
for(int i=a[0]-1;i>0;i--)
for(int j=10000/10;j>0;j/=10)
printf("%d",a[i]/j%10);
printf("\n");
}
void gcd(int a[],int b[],int t)
{
if(comp(a,b)==0)
{
p=t;
return ;
}
if(comp(a,b)<0)
{
gcd(b,a,t);
return ;
}
int ta=0,tb=0;
if(a[1]%2==0)
{
div(a,2);
ta=1;
}
if(b[1]%2==0)
{
div(b,2);
tb=1;
}
if(ta&&tb)
gcd(a,b,t+1);
else if(!ta&&!tb)
{
minus1(a,b);
gcd(a,b,t);
}
else
gcd(a,b,t);
}
int main()
{
init(a);
init(b);
gcd(a,b,0);
if(p==0)
print(a);
else
{
f[0]=f[1]=1;
for(int i=1;i<=p;i++)
mullow(f,2);
mulhigh(f,a);
print(f);
}
}