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

在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整除,但不是质数),正确的判断逻辑应该是:

  1. 小于2的数直接排除;
  2. 2是唯一的偶质数,直接判定为质数;
  3. 偶数直接排除;
  4. 对于大于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:25:12