C++ 高精度算法求解最小公倍数

本篇文章将详细介绍使用 C++ 语言和高精度算法解决求解多个正整数的最小公倍数问题。文章包含问题描述、解题思路、代码实现和时间复杂度分析等内容,并提供样例输入和输出,帮助读者更深入理解算法原理和代码实现细节。

问题描述

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

输入格式

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

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

输出格式

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

样例输入

5 2 3 4 5 6

样例输出

60

数据规模和约定

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

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

答案可能超过这个范围。

解题思路

首先,需要一个函数来计算两个数的最小公倍数。根据最小公倍数的定义,可以通过两个数的乘积除以它们的最大公约数来计算最小公倍数。所以,需要一个函数来计算两个数的最大公约数。

接下来,对于给定的n个数,可以先计算前两个数的最小公倍数,然后再将这个最小公倍数与下一个数求最小公倍数,一直迭代到最后一个数。

具体实现步骤

  1. 定义函数gcd,用于计算两个数的最大公约数。可以使用辗转相除法来计算最大公约数。
  2. 定义函数lcm,用于计算两个数的最小公倍数。根据最小公倍数的定义,可以使用两个数的乘积除以它们的最大公约数来计算最小公倍数。
  3. 读取输入的n和n个数,并将它们保存在一个数组中。
  4. 初始化最小公倍数为数组的第一个数。
  5. 使用循环遍历数组中的每个数,将最小公倍数与当前数求最小公倍数,并更新最小公倍数。
  6. 输出最小公倍数。

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 著作权归作者所有。请勿转载和采集!

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