质数查找程序未返回任何数值,请求排查代码问题
问题排查与代码修正
先帮你拆解代码里的核心问题,这也是程序没返回任何数值的关键原因:
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
相关产品推荐
相关产品推荐

