C++ 递归算法求解最小公倍数 - 优化后的代码实现
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++ 递归算法的应用。
原文地址: https://www.cveoy.top/t/topic/pOP1 著作权归作者所有。请勿转载和采集!