JavaScript质数查找代码中嵌套for循环j值始终为0的原因
问题分析与修复
1. j始终为0的核心原因
你的内层循环每次仅执行一次就立刻触发break——不管进入if还是else分支,都会直接跳出循环,导致j完全没有机会执行j++,所以每次内层循环的j都停在初始值0。再加上你用var声明j(函数级作用域),外层循环每次都会重新赋值j=0,进一步固化了这个问题。
另外,i % 0会直接抛出除数为0的错误,这也是程序无法正常运行的隐藏问题。
2. 质数判断的逻辑错误
除了j的问题,你的质数判断逻辑完全不符合数学定义:
- 质数是大于1的自然数,仅能被1和自身整除,所以遍历范围应从
i=2开始(0和1既不是质数也不是合数) j的起始值应为2,所有数都能被1整除,无需判断- 当
i % j === 0时,说明i存在除1和自身外的因数,应归为notPrime而非prime - 不能刚进入判断就
break,需要遍历到i的平方根(或i/2)才能确定是否为质数
修复后的代码
const n = 100; const prime = []; const notPrime = []; if (n > 1) { // 从2开始遍历,0和1单独处理 for (let i = 2; i <= n; i++) { let isPrime = true; // j从2开始,遍历到i的平方根即可,优化性能 for (let j = 2; j * j <= i; j++) { if (i % j === 0) { isPrime = false; break; // 找到因数就跳出,无需继续判断 } } // 根据标记分配数组 isPrime ? prime.push(i) : notPrime.push(i); } // 处理0和1 notPrime.push(0, 1); } else { alert("请输入大于1的数字"); } console.log("质数数组:", prime); console.log("非质数数组:", notPrime);
修复说明
- 用
let声明j,块级作用域避免变量污染 - 内层循环仅在找到因数时才
break,确保完成必要判断 - 新增
isPrime标记,统一判断逻辑,避免重复操作 - 优化遍历范围到
i的平方根,减少循环次数提升性能 - 单独处理0和1,符合数学定义
内容的提问来源于stack exchange,提问作者13 Dhinesh A
相关产品推荐
相关产品推荐

