您的位置:首页 > 其它

最大公约数求解,GCD算法的通俗解释

2014-01-08 09:28 204 查看
有a,b两个数,要求写程序求解a,b两数的最大公约数,其实最简单的方法就是从2向上累加,找到最大的能够整除这两个数的那个数,但是这个暴力解法可能复杂度太高了,因此有人发明了使用辗转相除法求解两数的最大公约数,假设a>b,大致的过程就是先用a/b,然后令c=a-a/b*b,如果c=0,则b为最大公约数,否则,就递归的计算b和c的最大公约数,程序如下:

int gcd(int a,int b)
{
if(a<b)
{
int temp = a;
a = b;
b = temp;
}

if(a - a/b*b ==0)
return b;
else
return(b,a-a/b*b);

}


最开始我对这个方法只是知道这样,但是却不是了解其内部实现机制,近来突然想起这个东西,然后分析了下为啥这样能够求解。

我们来看,假设a与b存在最大公约数,则设最大公约数为q,则有a = q*x, b= q*y,那么a-b=q*(x-y),这说明a,a-b,b具有相同的最大公约数,其实求a,b的最大公约数跟求a-b,b的最大公约数是一样的,所以我们的求解过程中如果将后来的a-a/b*b换成a-b也是可以的,但是那样的话可能需要的递归次数就会多一点。

为了更快速的得到计算结果,我们肯定希望每次递归之后再次要计算a,b的值尽量小点。那么,我们有a/b=(q*x)/(q*y)=x/y,那么a-a/b*b = q*x - x/y*(y*q) = (x - x/y*y)*q,我们发现a-a/b*b与b的最大公约数仍然为q,这样我们就能快速的计算出来a,b的最大公约数q了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: