坚持使用Javascript数组,节点

时间:2013-06-27 12:09:34

标签: javascript arrays node.js

我是javascript / node的新手,我遇到了一个我必须找到素数的问题。我认为我的逻辑是正确的,但它产生额外的数字。这是代码 现在我使用2到100的数组。先谢谢你

var num = [2];
for (var i = 3; i < 101; i++){
  num.push(i);
}

for(i = 0; i <= num.length; i++){
  for(var k = 2; k <= i; k++){
    if( (num[i] % k) == 0){
      num.splice(i, 1);
    }
  }
}

var fs = require('fs');
var outfile = "hel.txt";
fs.writeFileSync(outfile, num);

2 个答案:

答案 0 :(得分:8)

声明“但它正在产生额外数字”不太正确。您生成的数组在开头包含最多100个数字。问题是并非所有非素数都被删除。

为什么呢?因为您在迭代时修改数组。结果是一些条目不会被检查,它们将被跳过。

示例:

想象一下数组

var num = [2,3,4,5,6,7,8,9,10,11];

i7,因此我们正在测试num[7] = 99不是素数,因此它会从数组中删除,然后看起来像

var num = [2,3,4,5,6,7,8,10,11];

在下一次迭代中,i8,我们正在测试num[8] = 11。请注意10未经过测试的方式?最初10位于索引8,但自从我们删除9后,其新索引为7,我们已经对其进行了测试。数组的大小发生了变化,“9右侧的所有元素都向左移动了一个位置。


要解决此问题,您可以在逆序中迭代数组(我还认为k <= i应为k < num[i]):

for (i = num.length - 1; i > -1; i--) {
  var n = num[i];
  for (var k = 2; k < n; k++) {
    if ((n % k) == 0) {
      num.splice(i, 1);
      break; // you can stop testing after you found a factor
    }
  }
}

对您的算法的小建议:仅测试直至数字平方根的因子就足够了,即:

for (var k = 2, r = Math.sqrt(n); k <= r; k++) {
    if ((n % k) == 0) {
      num.splice(i, 1);
      break;
    }
}

可能还有其他可能的改进,请查看http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:2)

试试这个:

 for(i = num.length; i >= 0; i--){
    findFactors: for(var k =2; k <= i; k++){
        if(num[i]%k ==0){
             num.splice(i,1);
             break findFactors;
        }
    }

我没有测试过,所以不确定它是否有效......