嵌套循环中使用splice方法误删质数且漏删非质数问题排查
质数筛选代码的问题分析与修复
问题根源
- 固定循环边界失效:一开始就把
n设为初始数组的长度减1,但数组用splice删除元素后长度会动态变化,原来的n和当前数组长度不匹配,导致遍历要么提前终止要么越界,漏删非质数或者误删质数。 - 内层循环起始位置错误:内层从0开始遍历,会把当前质数本身删掉(比如第一个质数2,会被自己的判断条件移除),而且数组缩短后元素前移,导致部分元素跳过检查,比如8这类非质数没被处理。
- 删除元素后未调整索引:用
splice删除元素后,后面的元素会向前移位,此时multiplier如果不递减,会直接跳过下一个元素,导致漏删。
修复后的代码
let list = []; for (let i = 2; i <= 30; i++) { list.push(i); } // 遍历数组,每次取当前索引的元素作为质数基准 for (let prim = 0; prim < list.length; prim++) { const currentPrime = list[prim]; // 从当前质数的下一个元素开始,避免删除自身 for (let multiplier = prim + 1; multiplier < list.length; multiplier++) { if (list[multiplier] % currentPrime === 0) { list.splice(multiplier, 1); // 删除后索引减1,防止跳过下一个元素 multiplier--; } } } console.log(list); // 输出正确的质数数组:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
修复说明
- 动态循环边界:外层循环用
list.length作为终止条件,每次数组变化后都会使用最新长度判断,保证遍历完整。 - 内层循环从
prim+1开始:只检查当前质数之后的元素,既不会误删质数本身,也不会重复检查已经处理过的元素。 - 删除后调整索引:每次
splice后把multiplier减1,抵消数组元素前移的影响,确保每个元素都能被正确检查。
内容的提问来源于stack exchange,提问作者fujitsu fiji
相关产品推荐
相关产品推荐

