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

Kotlin实现求第10001个素数时出现问题,寻求解决方法

问题排查与修正方案

先梳理下你的代码里存在的几个问题,再一步步给出修正方案:

1. 无效冗余代码

在checkPrime函数里:

  • stop变量完全多余——你在找到因数后直接return false,后续逻辑根本不会执行,最后return !stop可以直接替换成return true,能走到这一步就说明没有找到因数,必然是素数。
  • break语句写在return之后,永远不会被执行,属于无效代码,直接删掉即可。

2. 素数检查效率优化

原来的循环到n/2可以优化为循环到sqrt(n):如果n有一个大于平方根的因数,那必然存在一个对应的小于平方根的因数,这样能大幅减少循环次数,尤其是对大数来说,性能提升非常明显。

3. 终止逻辑优化

你当前是预先生成到500000的所有素数,其实可以在收集到第10001个素数时立刻停止遍历,不需要做多余的计算,节省资源。

修正后的完整代码

fun checkPrime(n: Int): Boolean {
    if (n <= 1) return false
    if (n == 2) return true // 单独处理唯一的偶素数
    if (n % 2 == 0) return false // 排除所有其他偶数
    // 只检查奇数因数,从3开始到sqrt(n),步长设为2
    val sqrtN = Math.sqrt(n.toDouble()).toInt()
    for (i in 3..sqrtN step 2) {
        if (n % i == 0) return false
    }
    return true
}

fun main() {
    val primes = mutableListOf<Int>()
    var num = 2
    // 收集够10001个素数就停止循环
    while (primes.size < 10001) {
        if (checkPrime(num)) {
            primes.add(num)
        }
        num++
    }
    // 注意集合索引从0开始,第10001个素数对应索引10000
    println("第10001个素数是:${primes[10000]}")
}

额外说明

  • 给checkPrime加了几个小优化:单独处理2、提前排除偶数,让循环只需要检查奇数因数,进一步提升效率。
  • 把ArrayList换成了Kotlin更推荐的mutableListOf()创建可变集合。
  • 终止条件改成primes.size < 10001,避免了遍历固定大数的冗余操作。

运行这段代码就能得到正确的第10001个素数啦。

内容的提问来源于stack exchange,提问作者snaldi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:49:59