求最大公因数的两种算法及 C 语言实现

更相减损术

《九章算术》云:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
即:将较大数减去较小数,将所得的差与较小数进行同样操作,直到减数与差相等,此数即为最大公因数。

  • 递归
int gcd(int a, int b) {
    if (a == b)
        return a;
    if (a > b)
        return gcd(a - b, b);
    return gcd(b, a); // 若 a < b, 则交换 a b, 直接进入下一层递归
}
  • 循环
int gcd(int a, int b) {
    while (a != b) {
        if (a > b) { // 必需条件: a > b
            a = a - b;
        } else {  // 若 a < b, 则交换 a b
            // 不依赖第三个变量的交换
            a = a - b;
            b = a + b;
            a = b - a;
        }
    }
    return a;
}

辗转相除法

将较大数除以较小数,将余数和较小数进行同样操作,直到余数为零,除数即为最大公因数。

  • 递归
int gcd(int a, int b) {
    if (b == 0)
        return a;
    if (a > b)
        return gcd(b, a % b);
    return gcd(a, b % a);
}
  • 循环
int gcd(int a, int b) {
    int t;
    while (b != 0) {
        if (a > b) { // 必需条件: a > b
            t = a;
            a = b;
            b = t % b;
        } else { // 若 a < b, 则交换 a b
            // 不依赖第三个变量的交换
            a = a - b;
            b = a + b;
            a = b - a;
        }
    }
    return a;
}

posted on 2022-02-06 05:38  UXOD  阅读(392)  评论(0编辑  收藏  举报