最大公约数(欧几里德算法or辗转相除法)
我们用gcd(a, b)表示a和b的最大公约数,那么
gcd(a, b) = gcd(b, a%b)
时间复杂度: O(lgb)
具体证明很多的,百度即可。
代码:
int gcd(int a, int b)
{
return (b?gcd(b, a%b):a);
}
(非递归版自己推)
最小公倍数:我们用lcm(a, b)表示a和b的最小公倍数,那么
lcm(a, b) = a*b/gcd(a, b)
这里要注意个细节优化,在程序中应该防止溢出,即要写成
lcm(a, b) = a/gcd(a, b)*b
时间复杂度:O(lgb)
同上gcd
代码:
inline lcm(int a, int b)
{return a / gcd(a, b) * b;}