C语言编程题计算最大公约数

计算两个数的最大公约数(GCD)是一个经典的算法问题,有多种方法可以实现。每种方法各有特点,适用于不同的场景和需求。在实际应用中,可以根据具体情况选择合适的方法来实现最大公约数的计算。

1、辗转相除法(欧几里德算法)

求两个数最大公约数最常用的方法之一,其原理是利用两个数的除法余数的递归来求解。

#include <stdio.h>

// 函数声明:计算最大公约数
int gcd(int a, int b);

int main() {
    int num1, num2;

    // 输入两个整数
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);

    // 调用函数计算最大公约数
    int result = gcd(num1, num2);

    // 输出最大公约数
    printf("最大公约数是:%d\n", result);

    return 0;
}

// 函数定义:计算最大公约数(辗转相除法)
int gcd(int a, int b) {
    int temp;
    while (b != 0) {
        temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}

2、递归实现辗转相除法

使用递归方式实现辗转相除法求最大公约数。

#include <stdio.h>

// 函数声明:计算最大公约数
int gcd(int a, int b);

int main() {
    int num1, num2;

    // 输入两个整数
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);

    // 调用函数计算最大公约数
    int result = gcd_recursive(num1, num2);

    // 输出最大公约数
    printf("最大公约数是:%d\n", result);

    return 0;
}

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

3、更相减损术

古老的方法,通过连续减小较大数和较小数的差来求最大公约数。

#include <stdio.h>

// 函数声明:计算最大公约数
int gcd(int a, int b);

int main() {
    int num1, num2;

    // 输入两个整数
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);

    // 调用函数计算最大公约数
    int result = gcd_subtraction(num1, num2);

    // 输出最大公约数
    printf("最大公约数是:%d\n", result);

    return 0;
}

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

4、穷举法

从较小的数开始递减,找到两个数都能整除的最大数。

#include <stdio.h>

// 函数声明:计算最大公约数
int gcd(int a, int b);

int main() {
    int num1, num2;

    // 输入两个整数
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);

    // 调用函数计算最大公约数
    int result = gcd_brute_force(num1, num2);

    // 输出最大公约数
    printf("最大公约数是:%d\n", result);

    return 0;
}

int gcd_brute_force(int a, int b) {
    int gcd = 1;
    for (int i = 1; i <= a && i <= b; ++i) {
        if (a % i == 0 && b % i == 0) {
            gcd = i;
        }
    }
    return gcd;
}

5、位操作法

利用位运算的性质来求解,效率较高。

#include <stdio.h>

// 函数声明:计算最大公约数
int gcd(int a, int b);

int main() {
    int num1, num2;

    // 输入两个整数
    printf("请输入两个整数:\n");
    scanf("%d %d", &num1, &num2);

    // 调用函数计算最大公约数
    int result = gcd_bitwise(num1, num2);

    // 输出最大公约数
    printf("最大公约数是:%d\n", result);

    return 0;
}

int gcd_bitwise(int a, int b) {
    if (a == 0) return b;
    if (b == 0) return a;
    int shift;
    for (shift = 0; ((a | b) & 1) == 0; ++shift) {
        a >>= 1;
        b >>= 1;
    }
    while ((a & 1) == 0) a >>= 1;
    do {
        while ((b & 1) == 0) b >>= 1;
        if (a > b) {
            unsigned int t = b; b = a; a = t;
        }
        b = b - a;
    } while (b != 0);
    return a << shift;
}

推荐阅读
cjavapy编程之路首页