1. 简介
在编程中,计算两个或多个数的最小公倍数(Least Common Multiple,LCM)是一个常见的数学问题。本文将介绍如何在 Kotlin 中计算两个整数的 LCM,并进一步扩展到多个整数的处理。
2. 什么是 LCM
最小公倍数(LCM)指的是能被两个或多个整数同时整除的最小正整数。以两个整数 a 和 b 为例,lcm(a, b) 表示的就是最小的那个正整数,它能同时被 a 和 b 整除。
计算两个整数 LCM 的公式如下:
lcm(a, b) = |a * b| / gcd(a, b)
其中,gcd(a, b) 表示 a 和 b 的最大公约数(Greatest Common Divisor)。这个公式虽然有效,但在实际编码中我们也可以采用更直观的遍历方式来实现。
3. Kotlin 中计算两个数的 LCM
下面是一个使用 Kotlin 实现的 LCM 计算函数:
fun findLCM(a: Int, b: Int): Int {
val larger = if (a > b) a else b
val maxLcm = a * b
var lcm = larger
while (lcm <= maxLcm) {
if (lcm % a == 0 && lcm % b == 0) {
return lcm
}
lcm += larger
}
return maxLcm
}
这段代码的思路是:从两个数中较大的那个开始,依次尝试它的倍数,直到找到一个能同时被 a 和 b 整除的最小值。✅ 这种方式虽然不是数学上最高效的方法,但在实际使用中逻辑清晰,易于理解。
为了验证这个函数的正确性,我们可以使用 JUnit 编写几个测试用例:
@Test
fun testLCM() {
assertEquals(12, findLCM(3, 4))
assertEquals(15, findLCM(5, 3))
assertEquals(35, findLCM(7, 5))
assertEquals(72, findLCM(24, 18))
}
4. 扩展:计算多个数的 LCM
如果我们需要计算多个数的最小公倍数,可以基于上面的 findLCM()
方法逐步进行。具体做法是:先计算前两个数的 LCM,再将结果与下一个数计算 LCM,依此类推。
fun findLCMOfListOfNumbers(numbers: List<Int>): Int {
var result = numbers[0]
for (i in 1 until numbers.size) {
result = findLCM(result, numbers[i])
}
return result
}
这段代码通过循环不断将当前的 LCM 与下一个数字进行比较和计算,最终得到整个列表的 LCM。
我们同样可以编写测试来验证其正确性:
@Test
fun testFindLCMOfListOfNumbers() {
assertEquals(12, findLCMOfListOfNumbers(listOf(3, 4)))
assertEquals(15, findLCMOfListOfNumbers(listOf(5, 3)))
assertEquals(35, findLCMOfListOfNumbers(listOf(7, 5, 5)))
assertEquals(72, findLCMOfListOfNumbers(listOf(24, 18, 12)))
}
⚠️ 注意:如果列表中包含 0 或负数,上述实现可能需要额外的边界检查,否则会出现错误。在实际使用中建议添加输入校验逻辑。
5. 小结
本文介绍了如何使用 Kotlin 实现两个整数的 LCM 计算,并进一步扩展到多个整数的场景。两种方法各有适用场景:
- ✅ 直接查找法逻辑清晰,适合教学或小规模计算;
- ✅ 利用 GCD 的公式法效率更高,适合性能敏感的场景。
完整代码示例已上传至 GitHub。欢迎参考学习。