辗转相除法的目的:求两个树的最大公约数
设两数为a、b(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)
}
最大公约数用处:
最小公倍数 = 两数之积 / 最大公约数
辗转相除法(Euclidean Algorithm)极简证明
时间: 2024-10-21 09:48:14