6.1.3 最大公约数

最大公约数

先给两种写法

简单,但是慢

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

稍微难写一点,但是飞快

int gcd (int a, int b) {
    if (a == 0 || b == 0) return a | b;
    int az = __builtin_ctz (a);
    int bz = __builtin_ctz (b);
    int z = min (az, bz), diff;
    b >>= bz;
    while (a) {
        a >>= az;
        diff = b - a;
        if (!diff) break;
        az = __builtin_ctz (diff);
        b = a < b ? a : b;
        a = diff < 0 : -diff : diff;
    }
    return b << z;
}

注意,如果 \(a,b\)long long ,那么一定要用 __builtin_ctzll 代替 __builtin_ctz ,否则会非常慢

image-20250705161840416

仅仅修改了这一个地方,就快了四秒多,千万别忘了

posted @ 2025-08-11 10:21  michaele  阅读(4)  评论(0)    收藏  举报