缺少数组中的最后一个元素

Kar*_*ing 1 javascript arrays primes

我试图将所有素数加起来一个数字.

首先,我删除了所有的平均值,然后将其余的推到了一个奇数阵列.

然后我将遍历数组并拼接除了其他数字但除了1和自身之外的所有数字,并用零替换它们.

一切似乎都没问题,但是,在我的第一个console.log中注意到最后一个元素是977(这是传递的数字).

一行后来我forEach数组并打印所有数字超过970但977不存在:/

关于这是怎么发生的任何想法?(我排除了伏都教..)

function sumPrimes(num) {

  var arr = [2];
  for (var i = 3; i <= num; i++) {
    if (i % 2 !== 0) {
      arr.push(i);
    }
  }

  console.log(arr);
  arr.forEach(function(x) {

    if(x > 970){
      console.log(x);
    }

    if (x > 3) {
      for (var j = 3; j < x; j += 2) {
        if (x % j == 0) {
          arr.splice(arr.indexOf(x), 1, 0);
        }
      }
    }
  })

  // console.log(arr);
  var res = arr.reduce(function(acc, val) {
    return acc + val;
  }, 0)
  console.log(res);
}

sumPrimes(977);
Run Code Online (Sandbox Code Playgroud)

Dav*_*e L 5

问题是你如何操作数组,数组实际上最终不会包含977.

发生的情况是你找到一个非素数并改变数组,使它现在为0,但你继续对该素数进行检查.

这会导致该值的任何后续indexOf查找返回-1,因此您会得到意外的结果.

if (x % j == 0) {
   arr.splice(arr.indexOf(x), 1, 0); // This won't work after the first assign to 0
}
Run Code Online (Sandbox Code Playgroud)

您可以通过插入"中断"轻松解决此问题.紧接着接头以使回路短路,但是您可以使用forEach中可用的索引参数轻松简化并大幅提高速度,从而完全消除阵列位置查找.

function sumPrimes(num) {

  var arr = [2];
  for (var i = 3; i <= num; i++) {
    if (i % 2 !== 0) {
      arr.push(i);
    }
  }

  console.log(arr);
  arr.forEach(function(x, idx) {

    if(x > 970){
      console.log(x);
    }

    if (x > 3) {
      for (var j = 3; j < x; j += 2) {
        if (x % j == 0) {
          arr[idx] = 0;
          break;
        }
      }
    }
  })

  // console.log(arr);
  var res = arr.reduce(function(acc, val) {
    return acc + val;
  }, 0)
  console.log(res);
}

sumPrimes(977);
Run Code Online (Sandbox Code Playgroud)


编辑:如果有人想要一种简单,更有效的方法来确定数字是否为素数,我建议使用试验分区方法,而不是上面的方法.

您可以在Rosetta代码上找到一个简洁,经过良好测试的示例:

function isPrime(n) {
  if (n == 2 || n == 3 || n == 5 || n == 7) {
    return true;
  } else if ((n < 2) || (n % 2 == 0)) {
    return false;
  } else {
    for (var i = 3; i <= Math.sqrt(n); i += 2) {
      if (n % i == 0)
        return false;
    }
    return true;
  }
}

console.log(isPrime(977));
Run Code Online (Sandbox Code Playgroud)