Zju2678 大数gcd
画图推导,大数gcd,摘自网上的模板
#include<stdio.h>
#include<string.h>
#define maxlen 1000+2 //数据的最大长度
struct HP { int len, s[maxlen]; } ; //存储数据的结构
char s1[maxlen],s2[maxlen];//存储输入的两个数据
void PrintHP(HP x) //输出
{
for(int i=x.len;i>=1;i--)printf("%d",x.s[i]);
printf("\n");
}
HP Str2HP(const char *s) //字符串转换成结构体数组,s数组中从1开始,并且从低位到高位
{
HP x; x.len=strlen(s);
for(int i=1;i<=x.len;i++)
x.s[i]=s[x.len-i]-'0';
return x;
}
int IsSmaller(const HP x ,const HP y) //比较两个数据的大小,返回>=0的数,表示 y>=x;
{
if(x.len<y.len)return 1;
if(x.len>y.len)return -1;
int i=x.len ;
while((i>1)&&(x.s[i]==y.s[i]))i--;
return y.s[i]-x.s[i];
}
HP Subtract(const HP a ,const HP b) //相减
{
HP c; int i,j;
for(i=1,j=0;i<=a.len;i++)
{
c.s[i]=a.s[i]-j;
if(i<=b.len)c.s[i]-=b.s[i];
if(c.s[i]<0)j=1,c.s[i]+=10;
else j=0;
}
c.len=a.len;
while(c.len>1&&!c.s[c.len])c.len--;
return c;
}
HP div2(const HP a) //除以2
{
int i,c; HP ret;ret.len=a.len;
for(c=0,i=a.len;i>=1;i--)
{
if((c*10+a.s[i])>=2)ret.s[i]=(c*10+a.s[i])/2,c=(c*10+a.s[i])%2;
else ret.s[i]=0,c=c*10+a.s[i];
}
while(ret.s[ret.len]==0)ret.len--;
return ret;
}
HP multi2(HP a) //乘以2
{
int i,c; HP ret; ret.len=a.len;
for(i=1,c=0;i<=a.len;i++)
{
ret.s[i]=(a.s[i]*2+c)%10;
c=(a.s[i]*2+c)/10;
}
if(c>0)ret.s[++ret.len]=c;
return ret;
}
HP stein(HP a,HP b)//返回一个结构体的最大公约数
{
int num=0;
while(a.len&&b.len)
{
if(a.s[1]%2)
{
if(b.s[1]%2)
{
if(IsSmaller(a,b)>=0)b=Subtract(b,a);
else a=Subtract(a,b);
}
else b=div2(b);
}
else
{
if(b.s[1]%2)a=div2(a);
else a=div2(a),b=div2(b),num++;
}
if(a.len==1&&a.s[1]==0) break;
if(b.len==1&&b.s[1]==0) break;
}
if(a.len)
{
while(num--)a=multi2(a);
return a;
}
else
{
while(num--)b=multi2(b);
return b;
}
}
int main()
{
HP a,b;
freopen("in.txt","r",stdin);
bool flag=0;
while(scanf("%s%s",s1,s2)!=EOF)
{
if(flag)
printf("\n");
flag=1;
a=Str2HP(s1);
b=Str2HP(s2);
PrintHP(stein(a,b));
}
return 0;
}