手写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
相关产品推荐
相关产品推荐

