gcd 和 lcm

Posted on 2023-02-22 16:58  lyc2002  阅读(16)  评论(0编辑  收藏  举报

时间复杂度

O(log max(a, b))

最大公约数

代码

int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}

最小公倍数

代码

int lcm(int a ,int b)
{
    return a * b / gcd(b, a % b);
}

更相减损法

int gcd_sub(int a, int b)
{
    if (a < b) swap(a, b);
    return b == 0 ? a : gcd_sub(b, a - b);
}

拓展用法

已知 qx 和 qy,求 q(x,y)

算法思想

qx / qy = qx-y,当 x-y == 0 时,b == 1

代码

int gcd_sub(int a, int b)
{
    if (a < b) swap(a, b);
    return b == 1 ? a : gcd_sub(b, a / b);
}