在Codecademy中查找数组质数时遭遇逻辑错误求助
问题分析与修复
你的核心问题出在质数判断的逻辑条件错误,以及对质数定义的理解不到位。
为什么当前代码会把所有元素加入列表?
你写的条件:
if ((nums[i] % 2 != 0 || nums[i] % 3 != 0 ) || nums[i] % 5 != 0)
用了逻辑或(||),只要三个条件中有一个成立,整个表达式就为真。比如数字6:
- 6%2==0 → 第一个子条件
nums[i]%2!=0为假 - 6%3==0 → 第二个子条件
nums[i]%3!=0为假 - 6%5!=0 → 第三个子条件为真
最终(false || false) || true结果是true,所以6会被错误加入列表。这就是为什么所有元素都被添加的原因。
质数判断的正确思路
质数的定义是:大于1的自然数,除了1和它本身之外,没有其他正因数。只检查2、3、5远远不够(比如121=11×11,不能被2、3、5整除,但不是质数),正确的判断逻辑应该是:
- 小于2的数直接排除;
- 2是唯一的偶质数,直接判定为质数;
- 偶数直接排除;
- 对于大于2的奇数,检查从3到其平方根的所有奇数,只要有一个能整除它,就不是质数。
修复后的代码
我们可以拆分出一个isPrime辅助方法,让逻辑更清晰:
import java.util.ArrayList; class PrimeDirective { // 判断单个数字是否为质数的辅助方法 private boolean isPrime(int num) { if (num < 2) { return false; } if (num == 2) { return true; } if (num % 2 == 0) { return false; } // 检查从3到num平方根的所有奇数 for (int i = 3; i <= Math.sqrt(num); i += 2) { if (num % i == 0) { return false; } } return true; } public void findPrime(int[] nums) { ArrayList<Integer> primeNumbers = new ArrayList<>(); for (int num : nums) { if (isPrime(num)) { primeNumbers.add(num); } } System.out.println(primeNumbers); } public static void main(String[] args) { PrimeDirective pd = new PrimeDirective(); int[] numbers = {6, 29, 28, 33, 11, 100, 101, 43, 89}; pd.findPrime(numbers); } }
代码说明
isPrime方法单独处理质数判断逻辑,职责单一,便于调试和维护;- 遍历数组时,直接调用
isPrime判断每个数字,逻辑简洁; - 最终运行结果会输出正确的质数列表:
[29, 11, 101, 43, 89]
内容的提问来源于stack exchange,提问作者Jack M
相关产品推荐
相关产品推荐

