在 C 语言中求最小公倍数(LCM)

CBeginner
立即练习

简介

在本实验中,你将学习如何使用 C 语言编程找到两个整数的最小公倍数(LCM)。本实验涵盖了逐步的过程,从从用户输入读取两个整数开始,然后实现公式 LCM = (a*b)/GCD(a,b) 来计算 LCM,最后打印结果。在本实验结束时,你将对如何应用数论概念(如用于求最大公约数(GCD)的欧几里得算法)来解决 C 语言中的实际问题有扎实的理解。

读取两个整数

在这一步中,你将学习如何在 C 语言编程中从用户输入读取两个整数,这是计算最小公倍数(LCM)的第一步。

首先,让我们为我们的 LCM 程序创建一个新的 C 文件:

cd ~/project
nano lcm.c

现在,添加以下代码来读取两个整数:

#include <stdio.h>

int main() {
    int a, b;

    printf("输入两个正整数:\n");
    printf("第一个数字:");
    scanf("%d", &a);

    printf("第二个数字:");
    scanf("%d", &b);

    printf("你输入的是:%d 和 %d\n", a, b);

    return 0;
}

编译并运行程序:

gcc lcm.c -o lcm
./lcm

示例输出:

输入两个正整数:
第一个数字:12
第二个数字:18
你输入的是:12 和 18

让我们来分析一下这段代码:

  • scanf() 函数用于从用户读取整数输入
  • %d 格式说明符用于整数输入
  • &a&b 传递输入值将被存储的内存地址

使用 LCM = (a*b)/GCD(a,b)

在这一步中,你将使用公式 LCM(a,b) = (a*b)/GCD(a,b) 来实现最小公倍数(LCM)的计算。我们将首先创建一个函数,使用欧几里得算法来计算最大公约数(GCD)。

使用以下代码更新 lcm.c 文件:

#include <stdio.h>

// 使用欧几里得算法计算 GCD 的函数
int calculateGCD(int a, int b) {
    while (b!= 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 计算 LCM 的函数
int calculateLCM(int a, int b) {
    return (a * b) / calculateGCD(a, b);
}

int main() {
    int a, b, lcm;

    printf("输入两个正整数:\n");
    printf("第一个数字:");
    scanf("%d", &a);

    printf("第二个数字:");
    scanf("%d", &b);

    lcm = calculateLCM(a, b);

    printf("%d 和 %d 的最小公倍数是:%d\n", a, b, lcm);

    return 0;
}

编译并运行程序:

gcc lcm.c -o lcm
./lcm

示例输出:

输入两个正整数:
第一个数字:12
第二个数字:18
12 和 18 的最小公倍数是:36

让我们来分析一下关键部分:

  • calculateGCD() 实现了欧几里得算法来找到最大公约数
  • calculateLCM() 使用公式 LCM(a,b) = (a*b)/GCD(a,b)
  • 欧几里得算法通过反复取余有效地找到 GCD

打印最小公倍数

在这最后一步中,你将运行最小公倍数(LCM)程序,并针对不同的输入组合验证其输出。我们将使用各种整数对来测试该程序,以演示最小公倍数的计算。

编译程序(如果尚未编译):

cd ~/project
gcc lcm.c -o lcm

使用不同的输入组合运行程序:

./lcm << EOF
12
18
EOF

12 和 18 的示例输出:

输入两个正整数:
第一个数字:12
第二个数字:18
12 和 18 的最小公倍数是:36

让我们再试一个示例:

./lcm << EOF
15
25
EOF

15 和 25 的示例输出:

输入两个正整数:
第一个数字:15
第二个数字:25
15 和 25 的最小公倍数是:75

需要理解的关键点:

  • 最小公倍数是能被两个输入数字整除的最小正整数
  • 对于 12 和 18,最小公倍数是 36
  • 对于 15 和 25,最小公倍数是 75
  • 该程序使用公式 LCM(a,b) = (a*b)/GCD(a,b)

为了使程序更健壮,你可以添加输入验证:

nano lcm.c

更新 main() 函数以包含输入验证:

int main() {
    int a, b, lcm;

    printf("输入两个正整数:\n");
    printf("第一个数字:");
    scanf("%d", &a);

    printf("第二个数字:");
    scanf("%d", &b);

    // 输入验证
    if (a <= 0 || b <= 0) {
        printf("错误:请仅输入正整数。\n");
        return 1;
    }

    lcm = calculateLCM(a, b);

    printf("%d 和 %d 的最小公倍数是:%d\n", a, b, lcm);

    return 0;
}

重新编译并测试更新后的程序:

gcc lcm.c -o lcm
./lcm

总结

在本实验中,你将学习如何在 C 语言编程中找到两个整数的最小公倍数(LCM)。首先,你将从用户输入中读取两个整数。然后,你将通过创建一个使用欧几里得算法计算最大公约数(GCD)的函数来实现公式 LCM(a,b) = (a*b)/GCD(a,b)。最后,你将打印计算出的最小公倍数。

关键学习要点包括:使用scanf()读取整数输入、实现欧几里得算法以找到最大公约数,以及使用该公式计算最小公倍数。在本实验结束时,你将对如何在 C 语言中找到两个数的最小公倍数有扎实的理解。