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;
}

上述代码实现了辗转相除法求最大公约数。首先定义了一个递归函数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;
}

上述代码实现了更相减损法求最大公约数。首先定义了一个循环,判断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;
}

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