最大公约数最小公倍数c语言

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

C语言实现最大公约数(GCD)和最小公倍数(LCM)

在C语言中,计算最大公约数(GCD)和最小公倍数(LCM)有几种常见方法,下面我将介绍几种实现方式。

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

使用欧几里得算法计算GCD

欧几里得算法是计算最大公约数的高效方法:

#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) {
    // 使用公式 LCM(a,b) = (a*b)/GCD(a,b)
    return (a * b) / gcd(a, b);
}
int main() {
    int num1, num2;
    printf("请输入两个正整数: ");
    scanf("%d %d", &num1, &num2);
    if (num1 <= 0 || num2 <= 0) {
        printf("请输入正整数!\n");
        return 1;
    }
    printf("最大公约数(GCD)是: %d\n", gcd(num1, num2));
    printf("最小公倍数(LCM)是: %d\n", lcm(num1, num2));
    return 0;
}

递归实现GCD

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

#include <stdio.h>
// 递归实现GCD
int gcd_recursive(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd_recursive(b, a % b);
}
int lcm(int a, int b) {
    return (a * b) / gcd_recursive(a, b);
}
int main() {
    int num1, num2;
    printf("请输入两个正整数: ");
    scanf("%d %d", &num1, &num2);
    if (num1 <= 0 || num2 <= 0) {
        printf("请输入正整数!\n");
        return 1;
    }
    printf("最大公约数(GCD)是: %d\n", gcd_recursive(num1, num2));
    printf("最小公倍数(LCM)是: %d\n", lcm(num1, num2));
    return 0;
}

处理负数的情况

如果需要处理负数,可以添加绝对值函数:

#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 lcm(int a, int b) {
    return abs(a * b) / gcd(a, b);
}
int main() {
    int num1, num2;
    printf("请输入两个整数: ");
    scanf("%d %d", &num1, &num2);
    printf("最大公约数(GCD)是: %d\n", gcd(num1, num2));
    printf("最小公倍数(LCM)是: %d\n", lcm(num1, num2));
    return 0;
}

计算多个数的GCD和LCM

如果要计算多个数的GCD和LCM,可以逐步计算:

最大公约数最小公倍数c语言
(图片来源网络,侵删)
#include <stdio.h>
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}
// 计算多个数的GCD
int gcd_multiple(int arr[], int n) {
    int result = arr[0];
    for (int i = 1; i < n; i++) {
        result = gcd(result, arr[i]);
    }
    return result;
}
// 计算多个数的LCM
int lcm_multiple(int arr[], int n) {
    int result = arr[0];
    for (int i = 1; i < n; i++) {
        result = lcm(result, arr[i]);
    }
    return result;
}
int main() {
    int n;
    printf("请输入数字的个数: ");
    scanf("%d", &n);
    if (n <= 0) {
        printf("请输入正整数!\n");
        return 1;
    }
    int numbers[n];
    printf("请输入%d个整数: ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }
    printf("这些数的最大公约数是: %d\n", gcd_multiple(numbers, n));
    printf("这些数的最小公倍数是: %d\n", lcm_multiple(numbers, n));
    return 0;
}

代码提供了几种不同的实现方式,可以根据具体需求选择使用,欧几里得算法是最常用且高效的GCD计算方法。

-- 展开阅读全文 --
头像
c语言helloworld
« 上一篇 03-26
c语言程序设计教程课后答案
下一篇 » 03-26
取消
微信二维码
支付宝二维码

目录[+]