尝试使用javascript查找素数总和时的错误

时间:2018-04-11 17:29:56

标签: javascript arrays for-loop primes

我正在尝试获得一个素数数组的总和,我知道有更优雅的方法可以做到这一点,并看到了这些解决方案的链接。

我的问题在这个特定的脚本中是错误的,我试图了解导致此代码失败的原因。

问题在于数字9,15和许多其他数据正被添加到素数数组中,即使它们都正确地未通过测试以检查它们是否为素数。尽管测试失败,我仍无法解决脚本中导致数字推送到数组的问题。同样,我并不是在寻找一种完全不同/更好的方法来总结质数,但是有些帮助确定这个脚本中究竟出错的是真的很感激。

function totalPrime(num) {
  var nums = [];
  var primes = [];

  for (var i = 1;
    (num - i) > 1; i++) {
    nums.push(num - i);
  }

  nums.forEach(isPrime);

  function isPrime(n) {
    var a = [];
    var test;
    if (n === 1) {} else if (n === 2) {
      primes.push(n);
    } else {
      for (var i = 1;
        (n - i) > 1; i++) {
        a.push(n - i);
      }
      a.forEach(function(x) {
        if ((n % x) === 0) {
          test = false;
        } else {
          test = true;
        }
      });
      if (test) {
        primes.push(n);
      } else {}
    };
  }

  console.log(primes.reduce(function(a, b) {
    return a + b
  }));
}

totalPrime(5);

与我用于调试的日志记录相同的脚本:

function totalPrime(num) {
  var nums = [];
  var primes = [];

  for (var i = 1;
    (num - i) > 1; i++) {
    nums.push(num - i);
  }

  nums.forEach(isPrime);


  function isPrime(n) {
    var a = [];
    var test;
    if (n === 1) {
      console.log(n + ' is NOT a prime number');
    } else if (n === 2) {
      console.log(n + ' IS a prime number');
      primes.push(n);
    } else {
      for (var i = 1;
        (n - i) > 1; i++) {
        a.push(n - i);
      }
      a.forEach(function(x) {
        if ((n % x) === 0) {
          test = false;
          console.log(n + ' % ' + x + ' equals 0');
          console.log(x + ' fails check');
        } else {
          test = true;
          console.log(n + ' % ' + x + ' does NOT equal 0');
          console.log(x + ' passes check');
        }
      });
      if (test) {
        console.log(n + ' IS a prime number.');
        primes.push(n);
      } else {
        console.log(n + ' is NOT a prime number.');
      }
    };
  }

  console.log(primes);
  console.log(primes.reduce(function(a, b) {
    return a + b
  }));
}

totalPrime(5);

1 个答案:

答案 0 :(得分:2)

每次测试中的test值都会覆盖上一次检查。因此,实际上只有最后一次检查(除以2)变得相关,并且所有奇数素数都失败。

您可以通过将test的默认值更改为true来更正它,并删除代码test = true;中的现有行。

更正的代码:

function isPrime(n) {
  var a = [];
  var test = true;
  if (n === 1) {} else if (n === 2) {
    primes.push(n);
  } else {
    for (var i = 1;
      (n - i) > 1; i++) {
      a.push(n - i);
    }
    a.forEach(function(x) {
      if ((n % x) === 0) {
        test = false;
      } 
    });
    if (test) {
      primes.push(n);
    }
  };
}