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
相关产品推荐
相关产品推荐

