编程之美--最大公约数问题

1、题目:求两个正整数的最大公约数,如果两个正整数都很大,有什么简单的算法吗?

解法一:辗转相除法。

int gcd(int x, int y)
{
	return (!y) ? x : gcd(y, x%y);
}

解法二:如果一个数能够同时整除x和y,则必能同时整除x-y和y。而
能够同时整除x-y和y的数也必能同时整除x和y。即x和y的公约数与x-y和y的公约数是相同的,其最大公约数也是相同的,即f(x, y) = f(x-y, y)。

BigInt gcd(BigInt x, BigInt y)
{
	if(x<y)
		return gcd(y, x);
	if(y == 0)
		return x;
	else
		return gcd(x-y, y);
}


解法三:利用移位运算和减法运算,避开大整数除法。

BigInt gcd(BigInt x, BigInt y)
{
	if(x<y)
		return gcd(y, x);
	if(y == 0)
		return x;
	else
	{
		if(IsEven(x))
		{
			if(IsEven(y))
				return (gcd(x >> 1, y >> 1) << 1);
			else
				return gcd(x >> 1, y);
		}
		else
		{
			if(IsEven(y))
				return gcd(x, y >> 1);
			else
				return gcd(y, x - y);
		}
	}
}

 

    原文作者:笨蛋糕
    原文地址: https://blog.csdn.net/woshibendangao/article/details/38657471
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞