【编程之美2.7】求最大公约数

int gcd(int x,int y)
{
	if(x<y)
		return gcd(y,x);
	if(y==0)
		return x;
	else
	{
		//x是偶数
		if(x%2==0)
		{
			if(y%2==0)
				return (gcd(x>>1,y>>1)<<1);
			else
				return gcd(x>>1,y);
		}
		//x是奇数
		else
		{
			if(y%2==0)
				return gcd(x,y>>1);
			else
				return gcd(y,x-y);
		}
	}
}
//尾递归转化为非递归
int gcd0(int x,int y)
{
	int tmp;
	if(x<y)
	{
		tmp=x;
		x=y;
		y=tmp;
	}
	if(y==0)
		return x;
	int gcd=1;
	while(y)
	{
		if(x%2==0)
		{
			if(y%2==0)
			{
				x=x>>1;
				y=y>>1;
				gcd<<=1;
			}
			else
			{
				x>>=1;
				if(x<y)
				{
					tmp=x;
					x=y;
					y=tmp;
				}
			}
		}
		else
		{
			if(y%2==0)
			{
				y>>=1;
			}
			else
			{
				tmp=x-y;
				if(tmp>y)
				{
					x=tmp;
				}
				else
				{
					x=y;
					y=tmp;
				}
			}
		}
	}
	return gcd*x;
}
//一般的非递归算法
int gcd1(int x,int y)
{
	int tmp;
	if(x<y)
	{
		tmp=x;
		x=y;
		y=x;
	}
	while(y)
	{
		tmp=x%y;
		x=y;
		y=tmp;
	}
	return x;
}


 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页