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

嵌套循环中使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:35:18