C++ 递归算法求解最小公倍数 - 优化后的代码实现

本篇文章详细讲解如何使用 C++ 语言和递归算法求解多个正整数的最小公倍数,并提供完整的代码实现和示例。

问题描述

给定 n 个正整数,求它们的最小公倍数。

输入格式

输入的第一行包含一个整数 n,表示给定的数的个数。

接下来 n 行,包含 n 个正整数,为给定的数。

输出格式

输出一个整数,表示给定数的最小公倍数。

样例输入

5
2 3 4 5 6

样例输出

60

数据规模和约定

对于 30% 的数据,1 <= n <= 10,给定的数不超过 100。

对于 100% 的数据,1 <= n <= 1000,给定的数不超过 1000000000000。答案可能超过这个范围。

解题思路

首先需要编写一个函数来计算两个数的最大公约数,可以使用辗转相除法来实现。然后利用最大公约数的性质,可以计算出两个数的最小公倍数为两个数的乘积除以最大公约数。

接下来可以使用递归的方式,依次计算给定数的最小公倍数。假设给定的数为 a1, a2, ..., an,那么可以先计算 a1 和 a2 的最小公倍数,再将结果与 a3 计算最小公倍数,以此类推,直到计算到 an 为止。

伪代码如下:

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

int lcm(int a, int b) {
    return a / gcd(a, b) * b;
}

int lcmRecursive(int arr[], int n) {
    if (n == 1) {
        return arr[0];
    }
    return lcm(arr[n-1], lcmRecursive(arr, n-1));
}

具体实现如下:

#include <iostream>
using namespace std;

long long gcd(long long a, long long b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

long long lcm(long long a, long long b) {
    return a / gcd(a, b) * b;
}

long long lcmRecursive(long long arr[], int n) {
    if (n == 1) {
        return arr[0];
    }
    return lcm(arr[n-1], lcmRecursive(arr, n-1));
}

int main() {
    int n;
    cin >> n;
    long long arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    long long result = lcmRecursive(arr, n);
    cout << result << endl;
    return 0;
}

优化后的代码

#include <iostream>
using namespace std;

long long gcd(long long a, long long b) {
    while (b != 0) {
        long long temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

long long lcm(long long a, long long b) {
    return (a * b) / gcd(a, b);
}

long long lcmRecursive(long long arr[], int n) {
    if (n == 1) {
        return arr[0];
    }
    return lcm(arr[n - 1], lcmRecursive(arr, n - 1));
}

int main() {
    int n;
    cin >> n;
    long long arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    long long result = lcmRecursive(arr, n);
    cout << result << endl;
    return 0;
}

代码说明

  • gcd(a, b) 函数使用辗转相除法计算两个数的最大公约数,并进行优化,使用循环代替递归,提高效率。
  • lcm(a, b) 函数根据最大公约数计算两个数的最小公倍数,使用乘法代替除法,避免精度损失。
  • lcmRecursive(arr[], n) 函数使用递归的方式计算给定数的最小公倍数,每次递归调用都计算两个数的最小公倍数,并将结果传递给下一层递归调用。

总结

本文介绍了使用 C++ 语言和递归算法求解多个正整数的最小公倍数的方法,并提供了完整的代码实现和示例。代码中使用辗转相除法计算最大公约数,并利用最大公约数的性质计算最小公倍数。使用递归的方式实现计算过程,并进行代码优化,提高效率。

希望本文能帮助您理解并掌握 C++ 递归算法的应用。

C++ 递归算法求解最小公倍数 - 优化后的代码实现

原文地址: https://www.cveoy.top/t/topic/pOP1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录