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

质数查找程序未返回任何数值,请求排查代码问题

问题排查与代码修正

先帮你拆解代码里的核心问题,这也是程序没返回任何数值的关键原因:

1. 内层循环范围错误(最致命问题)

你的内层循环写的是 for(int y = 2; y < upper; y ++),这意味着不管当前判断的数x是多少,y都会一直循环到upper-1。举个例子:

  • 假设你要判断x=2(质数),如果upper大于2,那么y一定会走到2这一步,此时2%2==0,decider会被设为false,导致这个质数被排除。
  • 所有大于等于2的数,都会在y=x的时候触发x%y==0,直接把decider置为false,最后只有x=1可能满足条件,但1并不是质数。

正确的内层循环应该只判断到x的平方根(或者至少到x本身,不过到平方根效率更高),因为如果x有一个大于平方根的因数,那必然对应一个小于平方根的因数,没必要循环到更大的数。

2. 未排除小于2的非质数

质数的定义是大于1的自然数,如果你的lower小于2(比如0、1或者负数),这些数会被误判为质数,但实际上它们不符合质数的定义。


修正后的代码

public ArrayList<Integer> findPrimes(int upper, int lower) {
    ArrayList<Integer> primeNumbers = new ArrayList<>();
    
    // 先处理边界:确保起始值不小于2
    int start = Math.max(lower, 2);
    
    for(int x = start; x <= upper; x++) {
        boolean isPrime = true;
        // 内层循环只需要到x的平方根,提升效率
        for(int y = 2; y <= Math.sqrt(x); y++) {
            if(x % y == 0) {
                isPrime = false;
                break; // 一旦找到因数,直接跳出循环,不用继续判断
            }
        }
        if(isPrime) {
            primeNumbers.add(x);
        }
    }
    return primeNumbers;
}

关键修改点说明

  • 把变量名decider改成isPrime,更符合语义,可读性更强。
  • 用Math.max(lower, 2)确保我们从最小的质数2开始判断,避免无效的数。
  • 内层循环改为y <= Math.sqrt(x),大幅减少循环次数,同时避免了误判。
  • 找到因数后用break跳出内层循环,提升程序效率。

你可以测试一下这个版本,比如调用findPrimes(10, 2),应该会返回[2,3,5,7],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:30:40