目录

gcd

1209

辗转相除求gcd

辗转相除: 设a>b(a<b也同理,执行一次后变为a>b,%的特性) 设x为他们的最大公因数,则a/x =y1 && b/x=y2,(y1>y2) 则(a-b)/x = y3 y1,y2,y3都是正整数 所以gcd(a,b) = gcd(b,a-b) 多次操作-> gcd(a,b) = gcd(b,a%b),(等效) a%b == 0时b为gcd 这时下一次操作,a=原先的b,b = 0, 运行到最后必有b=0 此外,LCM(a,b) = a*b/GCD(a,b)

源代码

int GCD(int a, int b)
{
    int t;
    while (b != 0)
    {
        t = a % b;
        a = b;
        b = t;
    }
    return a;
}
int gcd(int a, int b) {
    return a % b == 0 ? b : gcd(b, a % b);
}
int lcm(int a,int b) {
	return a / gcd(a, b) * b;
}

推荐文章

背包DP
并查集