1. 辗转相除法

辗转相除法也称为欧几里德算法,用于求两个正整数的最大公约数。算法的基本原理是通过反复将一个数除以另一个数取余,然后将除数作为新的被除数,余数作为新的除数,重复该过程直到余数为 0,此时除数即为最大公约数。

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
}

int main() {
    int a, b;
    printf("请输入两个正整数:");
    scanf("%d %d", &a, &b);
    int result = gcd(a, b);
    printf("最大公约数为:%d\n", result);
    return 0;
}
C

上述代码实现了辗转相除法求最大公约数。首先定义了一个递归函数 gcd,在该函数中,如果 b 为 0,则 a 为最大公约数,否则递归调用 gcd,将 b 和 a%b 作为新的参数传入。在主函数中,读入两个正整数 a 和 b,调用 gcd 函数求最大公约数,并将结果输出。

2. 更相减损法

更相减损法是另一种求最大公约数的方法,它通过不断相减两个数的较大值和较小值,然后更新两个数,直到两个数相等,此时即为最大公约数。然而,这种方法的效率较低,对于较大的数可能会出现运算溢出的问题。

#include <stdio.h>

int gcd(int a, int b) {
    while (a != b) {
        if (a > b) {
            a -= b;
        } else {
            b -= a;
        }
    }
    return a;
}

int main() {
    int a, b;
    printf("请输入两个正整数:");
    scanf("%d %d", &a, &b);
    int result = gcd(a, b);
    printf("最大公约数为:%d\n", result);
    return 0;
}
C

上述代码实现了更相减损法求最大公约数。首先定义了一个循环,判断 a 和 b 是否相等,如果不相等则判断 a 和 b 的大小关系,如果 a 大于 b,则将 a 减去 b,否则将 b 减去 a,直到 a 和 b 相等,此时的值即为最大公约数。

3. 辗转相减法

辗转相减法是辗转相除法的改进版本,它通过不断相减两个数的较大值和较小值的 2 的次方倍,然后更新两个数,直到两个数相等,此时即为最大公约数。这种方法可以避免运算溢出的问题,提高了运算效率。

#include <stdio.h>

int gcd(int a, int b) {
    int factor = 1;
    while (a != b) {
        if (a % 2 == 0 && b % 2 == 0) {
            a /= 2;
            b /= 2;
            factor *= 2;
        } else if (a % 2 == 0) {
            a /= 2;
        } else if (b % 2 == 0) {
            b /= 2;
        } else if (a > b) {
            a = (a - b) / 2;
        } else {
            b = (b - a) / 2;
        }
    }
    return a * factor;
}

int main() {
    int a, b;
    printf("请输入两个正整数:");
    scanf("%d %d", &a, &b);
    int result = gcd(a, b);
    printf("最大公约数为:%d\n", result);
    return 0;
}
C

上述代码实现了辗转相减法求最大公约数。首先定义了循环和一个因数 factor,循环判断 a 和 b 是否相等,如果不相等则判断 a 和 b 的奇偶性,如果两个数都是偶数,则将两个数都除以 2,并将因数乘以 2;如果 a 是偶数,则将 a 除以 2;如果 b 是偶数,则将 b 除以 2;如果两个数都是奇数,则将较大的数减去较小的数,并将结果除以 2,直到 a 和 b 相等,此时的值乘以因数即为最大公约数。