题目描述
给定一个整数数组 nums,找出数组中所有非零元素的最小公倍数(LCM)。如果数组中没有非零元素,返回 -1。
输入: 一个整数数组 nums。
输出: 返回数组中所有非零元素的最小公倍数(LCM),如果数组中没有非零元素则返回 -1。
示例:
示例 1:
输入: nums = [1, 2, 3, 4, 5]
输出: 60
解释: 1, 2, 3, 4, 5 的最小公倍数是 60。
示例 2:
输入: nums = [0, 0, 0]
输出: -1
解释: 数组中没有非零元素。
解题思路
- 过滤非零元素:首先遍历数组,提取出所有非零元素。
- 边界情况处理:如果没有非零元素,返回 -1。
- 计算最大公约数(GCD):利用欧几里得算法计算两个数的最大公约数。
- 计算最小公倍数(LCM):利用公式 LCM(a, b) = abs(a * b) / GCD(a, b) 计算两个数的最小公倍数。
- 累积计算:通过累积的方式计算所有非零元素的最小公倍数。
Java 代码解析
import java.util.*;
public class Main {
public static int findLCM(int[] nums) {
List<Integer> nonZeroNums = new ArrayList<>();
for (int num : nums) {
if (num != 0) {
nonZeroNums.add(num);
}
}
if (nonZeroNums.isEmpty()) {
return -1;
}
int result = nonZeroNums.get(0);
for (int i = 1; i < nonZeroNums.size(); i++) {
result = lcm(result, nonZeroNums.get(i));
}
return result;
}
private static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
private static int lcm(int a, int b) {
return Math.abs(a * b) / gcd(a, b);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
System.out.println(findLCM(nums));
}
}
C++ 代码解析
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int lcm(int a, int b) {
return abs(a * b) / gcd(a, b);
}
int findLCM(const vector<int>& nums) {
vector<int> nonZeroNums;
for (int num : nums) {
if (num != 0) {
nonZeroNums.push_back(num);
}
}
if (nonZeroNums.empty()) {
return -1;
}
int result = nonZeroNums[0];
for (int i = 1; i < nonZeroNums.size(); i++) {
result = lcm(result, nonZeroNums[i]);
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << findLCM(nums) << endl;
return 0;
}
Python 代码解析
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
def lcm(a, b):
return abs(a * b) // gcd(a, b)
def find_lcm(nums):
non_zero_nums = [num for num in nums if num != 0]
if not non_zero_nums:
return -1
result = non_zero_nums[0]
for num in non_zero_nums[1:]:
result = lcm(result, num)
return result
if __name__ == "__main__":
n = int(input())
nums = list(map(int, input().split()))
print(find_lcm(nums))