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

有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了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值