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

手写JavaScript质数生成代码异常:生成小于20的质数时输出重复值求助

问题排查:生成小于20的质数代码逻辑错误分析

首先纠正你示例里的关键错误:6 % 3 的结果是 0,不是3——这是你后续逻辑出错的根源。质数的核心定义是:大于1的自然数,除了1和自身外,无法被其他自然数整除。

现在看你的代码,核心问题有3个:


1. 内层循环范围冗余且无意义

你内层循环从20倒序到1,但对于数字x来说,比x大的数不可能整除x(除了x自己),完全不需要检查大于x的数,只需要覆盖 2 <= i < x 这个范围就足够判断质数。

2. 判断逻辑完全错误

你写的 if (x % i !== i) 完全不符合质数判断逻辑:

  • 当i > x时,x % i 的结果就是x本身,此时x % i !== i 永远成立(因为x < i),所以每次内层循环都会执行arr.push(x),这就是你得到大量重复数字的原因。
  • 你真正需要的逻辑是:如果存在i(2<=i<x)使得x%i === 0,那x不是质数,而非当前的错误条件。

3. 缺少质数状态标记,导致重复添加

你现在每次满足条件就把x推入数组,而不是判断x整体是否为质数后再添加,导致同一个x被内层循环多次push,最终数组全是重复项。


基于你的思路的修正版本(逐步优化,不直接用最优解)

按照你“从零开始实践”的需求,基于你的原始代码结构调整必要逻辑:

let arr = [];

for (let x = 3; x <= 20; x++) {
  let isPrime = true; // 标记当前x是否为质数
  // 内层循环只检查2到x-1的数,足够判断质数
  for (let i = 2; i < x; i++) {
    // 找到能整除x的数,标记为非质数,直接跳出循环(无需继续检查)
    if (x % i === 0) {
      isPrime = false;
      break;
    }
  }
  // 仅当x是质数时,才添加到数组
  if (isPrime) {
    arr.push(x);
  }
}
console.log(arr); // 输出:[3,5,7,11,13,17,19]

这个版本保留了你外层循环的核心逻辑,仅修正了内层循环范围、判断条件,并添加了状态标记,解决了重复添加的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:55:12