首页 > 代码库 > 辗转相除法(Euclidean Algorithm)极简证明

辗转相除法(Euclidean Algorithm)极简证明

辗转相除法的目的:求两个树的最大公约数

 

设两数为ab(a > b),求它们最大公约数的步骤如下:

设q = a / b,r = a % b, 得a=bq+r(0≤r<b)。

1)若r = 0, 则b是a和b的最大公约数。

2)若r≠0,则继续考虑。可以证明:a 和 b 的最大公约数也是 b 和 r 的最大公约数

那么在第二种情况下公约数的关系就有一个递推传递的关系。

就是 a     b   的公约数等于    b      r(a % b)的公约数(a=bq+r)在后者不等于零的情况下,这个循环可以一直递推下去。

就是b      r(a%b)之间的公约数    等于r(a % b)  b%r的的公约数

…..

只到第二个 第一个数%第二个数 等于0,这时候的第第一个数:a‘,是整个过程中每一对数的最大公约,也是最开始的a 和b的最大公约数

 

一句话总结:给出两个自然数 first 和 second:检查 second 是否为0;如果是,则 这时候的first 为最大公约数,或者说为整个递推循环中的每一对树的最大公约数。如果second不为0,则分别用 second 和 first%second 作为下一步分 第一个数 和 第二个数 重复这一递推步骤


代码

int gcd(int first  int second)

{

        return second==0?first:gcd(second, first%second)

}


最大公约数用处:

最小公倍数 = 两数之积 / 最大公约数