You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用欧几里得算法求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:01:23