C++ 高精度算法求解最小公倍数 - 详细解析及代码实现
C++ 高精度算法求解最小公倍数
本篇文章将详细介绍使用 C++ 语言和高精度算法解决求解多个正整数的最小公倍数问题。文章包含问题描述、解题思路、代码实现和时间复杂度分析等内容,并提供样例输入和输出,帮助读者更深入理解算法原理和代码实现细节。
问题描述
给定n个正整数,求它们的最小公倍数。
输入格式
输入的第一行包含一个整数n,表示给定的数的个数。
接下来n行,包含n个正整数,为给定的数。
输出格式
输出一个整数,表示给定数的最小公倍数。
样例输入
5 2 3 4 5 6
样例输出
60
数据规模和约定
对于30%的数据,1<=n<=10,给定的数不超过100。
对于100%的数据,1<=n<=1000,给定的数不超过 1000000000000。
答案可能超过这个范围。
解题思路
首先,需要一个函数来计算两个数的最小公倍数。根据最小公倍数的定义,可以通过两个数的乘积除以它们的最大公约数来计算最小公倍数。所以,需要一个函数来计算两个数的最大公约数。
接下来,对于给定的n个数,可以先计算前两个数的最小公倍数,然后再将这个最小公倍数与下一个数求最小公倍数,一直迭代到最后一个数。
具体实现步骤
- 定义函数
gcd,用于计算两个数的最大公约数。可以使用辗转相除法来计算最大公约数。 - 定义函数
lcm,用于计算两个数的最小公倍数。根据最小公倍数的定义,可以使用两个数的乘积除以它们的最大公约数来计算最小公倍数。 - 读取输入的n和n个数,并将它们保存在一个数组中。
- 初始化最小公倍数为数组的第一个数。
- 使用循环遍历数组中的每个数,将最小公倍数与当前数求最小公倍数,并更新最小公倍数。
- 输出最小公倍数。
C++ 代码实现如下:
#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 * b / gcd(a, b);
}
int main() {
int n;
cin >> n;
long long nums[n];
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
long long result = nums[0];
for (int i = 1; i < n; i++) {
result = lcm(result, nums[i]);
}
cout << result << endl;
return 0;
}
时间复杂度分析
假设n个数的最小公倍数为L,那么计算两个数的最小公倍数的时间复杂度为O(log(max(a, b))),其中a和b为两个数。所以,计算n个数的最小公倍数的时间复杂度为O(nlogL)。
原文地址: https://www.cveoy.top/t/topic/pOQW 著作权归作者所有。请勿转载和采集!