C语言如何高效求最小公倍数与最大公约数?

99ANYc3cd6
预计阅读时长 10 分钟
位置: 首页 C语言 正文

在C语言中,计算两个数的最大公约数(GCD, Greatest Common Divisor)最小公倍数(LCM, Least Common Multiple)是常见的数学问题,以下是几种实现方法:

c语言最小公倍数和最大公约数
(图片来源网络,侵删)

使用欧几里得算法(辗转相除法)求GCD

欧几里得算法是一种高效计算GCD的方法,基于以下原理:

gcd(a, b) = gcd(b, a % b),直到 b == 0a 就是GCD。

代码实现

#include <stdio.h>
// 计算最大公约数(GCD)
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
int main() {
    int num1, num2;
    printf("请输入两个正整数: ");
    scanf("%d %d", &num1, &num2);
    int result_gcd = gcd(num1, num2);
    printf("最大公约数(GCD): %d\n", result_gcd);
    return 0;
}

示例

输入:12 18
输出:最大公约数(GCD): 6


计算最小公倍数(LCM)

最小公倍数可以通过GCD计算:

c语言最小公倍数和最大公约数
(图片来源网络,侵删)

lcm(a, b) = (a * b) / gcd(a, b)

代码实现

#include <stdio.h>
// 计算最大公约数(GCD)
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
// 计算最小公倍数(LCM)
int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}
int main() {
    int num1, num2;
    printf("请输入两个正整数: ");
    scanf("%d %d", &num1, &num2);
    int result_gcd = gcd(num1, num2);
    int result_lcm = lcm(num1, num2);
    printf("最大公约数(GCD): %d\n", result_gcd);
    printf("最小公倍数(LCM): %d\n", result_lcm);
    return 0;
}

示例

输入:12 18
输出:

最大公约数(GCD): 6
最小公倍数(LCM): 36

递归实现GCD

欧几里得算法也可以用递归方式实现:

代码

#include <stdio.h>
// 递归计算GCD
int gcd_recursive(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd_recursive(b, a % b);
}
int main() {
    int num1, num2;
    printf("请输入两个正整数: ");
    scanf("%d %d", &num1, &num2);
    int result_gcd = gcd_recursive(num1, num2);
    printf("最大公约数(GCD): %d\n", result_gcd);
    return 0;
}

处理负数

如果输入可能是负数,可以取绝对值后再计算:

c语言最小公倍数和最大公约数
(图片来源网络,侵删)

代码

#include <stdio.h>
#include <stdlib.h> // 用于 abs()
int gcd(int a, int b) {
    a = abs(a);
    b = abs(b);
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
int main() {
    int num1, num2;
    printf("请输入两个整数(可正可负): ");
    scanf("%d %d", &num1, &num2);
    int result_gcd = gcd(num1, num2);
    printf("最大公约数(GCD): %d\n", result_gcd);
    return 0;
}

方法 适用场景 特点
欧几里得算法(迭代) 最常用 高效,适用于大数
欧几里得算法(递归) 代码简洁 可能导致栈溢出(递归深度过大时)
LCM计算 依赖GCD lcm(a, b) = (a * b) / gcd(a, b)
处理负数 输入可能为负 使用 abs() 取绝对值

你可以根据需求选择合适的方法,如果只是计算GCD和LCM,欧几里得算法(迭代)是最推荐的方案。

-- 展开阅读全文 --
头像
dede后台无法注销登录怎么办?
« 上一篇 02-18
dede如何判断会员是否登录?
下一篇 » 02-18

相关文章

取消
微信二维码
支付宝二维码

目录[+]