两个二进制数的最大公约数,模板代码如下
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define maxn 1010
struct node{
int l;
int v[maxn];
};
bool issmaller(node x1,node x2)
{
if(x1.l<x2.l)
return 1;
if(x1.l>x2.l)
return 0;
for(int i=x1.l-1;i>=0;i--)
{
if(x1.v[i]<x2.v[i])
return 1;
if(x1.v[i]>x2.v[i])
return 0;
}
return 0;
}
node Minus(node x1,node x2)
{
node s;
int i,k,teamp;
s=x1;
for(k=0,i=0;i<x2.l;i++)
{
teamp=s.v[i]-k-x2.v[i];
if(teamp>=0)
{
k=0;
s.v[i]=teamp;
}
else
{
k=1;
s.v[i]=teamp+2;
}
}
for(;i<x1.l;i++)
{
teamp=s.v[i]-k;
if(teamp>=0)
{
k=0;
s.v[i]=teamp;
}
else
{
k=1;
s.v[i]=teamp+2;
}
}
while(s.l>=1&&!s.v[s.l-1])
s.l--;
return s;
}
node div2(node n)
{
node s;
s.l=n.l-1;
for(int i=0;i<s.l;i++)
s.v[i]=n.v[i+1];
return s;
}
void gcd(node x1,node x2,int k)
{
long long w=0,i;
while(x1.l&&x2.l)
{
if(x1.v[0])
{
if(x2.v[0])
{
if(issmaller(x1,x2))
x2=Minus(x2,x1);
else
x1=Minus(x1,x2);
}
else
x2=div2(x2);
}
else
{
if(x2.v[0])
x1=div2(x1);
else
{
x1=div2(x1);
x2=div2(x2);
w++;
}
}
}
printf("Case #%d: ",k);
if(x2.l)
{
for(i=x2.l-1;i>=0;i--)
printf("%d",x2.v[i]);
}
else
{
for(i=x1.l-1;i>=0;i--)
printf("%d",x1.v[i]);
}
while(w--)
printf("0");
printf("\n");
}
int main(void)
{
int i,j,k,n,m,t,l;
node x1,x2;
char s1[maxn],s2[maxn];
scanf("%d",&t);
for(j=1;j<=t;j++)
{
scanf("%s%s",s1,s2);
l=strlen(s1);
x1.l=l;
for(i=0;i<l;i++)
{
x1.v[i]=s1[l-1-i]-'0';
}
l=strlen(s2);
x2.l=l;
for(i=0;i<l;i++)
x2.v[i]=s2[l-1-i]-'0';
gcd(x1,x2,j);
}
return 0;
}