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;

}

posted on 2012-03-12 16:23  Inpeace7  阅读(292)  评论(0编辑  收藏  举报

导航