使用欧几里得算法求N个数GCD的代码陷入无限循环问题
问题排查与修正方案
核心问题:无限死循环
你的代码陷入死循环的直接原因:
- 每次循环都会创建固定长度为50的
IntArray,Kotlin中IntArray默认所有元素初始值为0。 - 循环条件
array2.toSet().size!=1永远成立,因为新数组里既有你设置的差值,又有大量默认的0,集合大小不可能等于1,导致循环永远无法终止。
其他逻辑错误
除死循环外,代码还存在对多元素GCD计算逻辑的误解:
- 你试图用相邻元素差值的方式实现,但这不是正确的多元素GCD计算逻辑,且实现细节错误(比如直接复用原始数组的第一个元素到新数组)。
- 多元素GCD的正确逻辑是:迭代计算,先算前两个数的GCD,再用这个结果和第三个数算GCD,以此类推直到所有数处理完毕。
修正后的代码
fun main(){ val numbers = intArrayOf(24, 18, 30) val ex29 = Ex29() println("最大公约数:${ex29.calculateGCD(numbers)}") } class Ex29 { // 基于欧几里得算法计算两个数的GCD private fun gcd(a: Int, b: Int): Int { return if (b == 0) a else gcd(b, a % b) } // 计算数组中所有数的GCD fun calculateGCD(array: IntArray): Int { require(array.isNotEmpty()) { "数组不能为空" } var result = array[0] for (num in array.drop(1)) { result = gcd(result, num) // 若结果变为1,可提前终止,因为1与任何数的GCD都是1 if (result == 1) break } return result } }
代码说明
- 拆分出独立的两数GCD计算函数,基于标准欧几里得辗转相除法,逻辑清晰高效。
- 多元素GCD通过迭代逐步缩小结果,避免复杂的数组操作。
- 增加数组非空校验,防止空数组引发异常。
- 加入提前终止逻辑,当结果变为1时直接跳出循环,优化性能。
内容的提问来源于stack exchange,提问作者Shahina Ismoilova
相关产品推荐
相关产品推荐

