Euclid - 欧几里得算法(辗转相除法)


问题

求两正整数的最大公约数()和最小公倍数()。

解法

表示非负整数的最大公约数,任意正整数满足:

也可以写作:

,则第一步实际上会交换两个数字的位置,因为必然有。每一步得到的余数都会越来越小,必然存在一个数字使得即为的最大公约数。

为原始的,用迭代式表达:

对于第步递归,有。迭代到第步时得到即为最大公约数。

欧几里得算法的时间复杂度约为


源码

Euclid.h

Euclid.cpp

测试

EuclidTest.cpp