最大公约数求解,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的最大公约数,程序如下:
最开始我对这个方法只是知道这样,但是却不是了解其内部实现机制,近来突然想起这个东西,然后分析了下为啥这样能够求解。
我们来看,假设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了。
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了。
相关文章推荐
- 三种方法求解最大公约数
- 第十二周项目3-用递归的方法求解(最大公约数)
- 最大公约数求解
- 世界那么大 我想去看看(求解最大公约数)
- 两数交换和最大公约数求解
- python如何求解两数的最大公约数
- 第十二周 项目三-用递归方法求解-(3)用递归函数求两个数的最大公约数
- 最大公约数求解
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
- 第十二周项目3-用递归方法求解-求两个数的最大公约数
- 第十二周项目三 用递归方法求解(3)求两数最大公约数
- 最大公约数-——Gcd算法
- 最大公约数求解
- 最大公约数的求解
- 递归求解最大公约数...
- 最大公约数求解
- 【基本算法】求解最大公约数
- Python基于辗转相除法求解最大公约数的方法示例
- 最大公约数与最小公倍数求解
- 使用Python求解最大公约数