给两个大数求最大公约数。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,inf=1<<29,base=10000;
int T;
int a[1000],b[1000],c[1000],f[1000];
int read()
{
int f=1;char ch;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-')f=-1;
int res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return res*f;
}
void init(int a[])
{
string s;
cin>>s;
int len=s.length(),i,j;
for(i=0;i<len;i++)
{
j=(len-i+3)/4;
a[j]=a[j]*10+s[i]-'0';
}
a[0]=(len+3)/4;
}
int com(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 tmp=0;
for(int i=a[0];i>=1;i--)
{
tmp=tmp*base+a[i];
a[i]=tmp/2;
tmp%=2;
}
while(a[a[0]]==0&&a[0]>0)a[0]--;
}
void jian(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]+=base;
}
while(a[a[0]]==0&&a[0]>0)a[0]--;
}
}
void gcd(int a[],int b[],int t)
{
if(com(a,b)==0)
{
T=t;
return ;
}
if(com(a,b)<0)
{
gcd(b,a,t);
return ;
}
int ta=0,tb=0;
if(a[1]%2==0)
{
div(a);
ta=1;
}
if(b[1]%2==0)
{
div(b);
tb=1;
}
if(ta&&tb)gcd(a,b,t+1);
else if(!ta&&!tb)
{
jian(a,b);
gcd(a,b,t);
}
else gcd(a,b,t);
}
void print(int a[])
{
printf("%d",a[a[0]]);
for(int i=a[0]-1;i>0;i--)
for(int j=base/10;j>0;j/=10)
printf("%d",a[i]/j%10);
}
void mulow(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]/base;
a[i]%=base;
}
while(a[a[0]+1]>0)
{
a[0]++;
a[a[0]+1]=a[a[0]]/base;
a[a[0]]%=base;
}
}
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]/base;
c[i+j-1]%=base;
}
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];
}
int main()
{
init(a);init(b);
gcd(a,b,0);
if(T==0)print(a);
else
{
f[0]=f[1]=1;
for(int i=1;i<=T;i++)
mulow(f,2);
mulhigh(f,a);
print(f);
}
return 0;
}