【问题标题】:Stuck with Javascript array , node卡在 Javascript 数组、节点上
【发布时间】:2013-06-27 12:09:33
【问题描述】:

我是 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);

【问题讨论】:

    标签: javascript arrays node.js


    【解决方案1】:

    声明“但它正在产生额外的数字” 并不完全正确。您在开始时生成了包含最多 100 的所有数字的数组。问题是并非所有非质数都被删除了。

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

    例子:

    想象一下数组

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

    i 成为7,所以我们正在测试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 &lt;= i 应该是 k &lt; 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

    【讨论】:

    • 他的代码的hacky解决方案是if( (num[i] % k) == 0){ num.splice(i, 1);i--;}
    • @Bhanu423:代码中有一些错误,但我现在已经修复了。
    • 正要评论,反正它现在工作。无论如何,你能说出你的旧解决方案出了什么问题吗?提前致谢
    • @Bhanu423:我将k &lt;= i 更改为k &lt;= num[i],但这最终会计算出num[i] % num[i],当然0。因此,所有数字都从数组中删除。您的方法 (k &lt;= i) 之所以有效,是因为数组的索引与该索引处的值不同(即a[2] = 4 不是a[2] = 2)。否则你也会遇到这个问题。尽管如此,从2 迭代到外部循环的循环索引(您的方式)似乎也不正确(总体而言)。要获得有效的算法,请查看 Wikipedia 链接。
    【解决方案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;
            }
        }
    

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

    【讨论】:

    • 它也可以。无论如何,我赞成另一个答案,因为他的代码更接近我的。无论如何,没有回购协议来支持你,所以不要。无论如何感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 2015-11-06
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多