gcd和lcm算法
gcd(greatest common divisor)为最大公约数,lcm(least common multiple)为最小公倍数。
gcd算法
下面是欧几里得算法(Euclidean algorithm),也叫辗转相除法。
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
二进制gcd算法
与计算余数的执行速度相比,计算机执行减法运算、奇偶性判断和折半运算(通过位运算)的速度更快。下面的二进制gcd算法避免了欧几里得算法中对余数的计算过程:
#include <algorithm>
int gcd(int a, int b) {
// make sure a >= b.
if (a < b) {
std::swap(a, b);
}
if (b == 0) {
return a;
}
bool a_isodd = a & 1;
bool b_isodd = b & 1;
if (a_isodd && b_isodd) {
return gcd((a - b) >> 1, b);
} else if (a_isodd && !b_isodd) {
return gcd(a, b >> 1);
} else if (!a_isodd && b_isodd) {
return gcd(a >> 1, b);