卡住Javascript数组,节点

我在JavaScript /节点非常新,我被困在一个问题,我必须find素数。 我认为我的逻辑是正确的,但它正在产生额外的数字。 这里是代码现在我正在使用数组从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); 

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

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

例:

想象一下arrays

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

i7 ,所以我们正在testingnum[7] = 99不是素数,所以它被从数组中删除,然后看起来像

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

在下一个迭代中, i8 ,我们正在testingnum[8] = 11 。 注意10怎么没被testing? 原来10是在索引8但是因为我们删除了9 ,它的新索引是7 ,我们已经testing了。 数组的大小发生了变化,“ 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 } } } 

对您的algorithm的小build议:仅testing数字的平方根就足够了,即:

 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

尝试这个:

  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; } } 

我没有testing它,所以不知道它是否工作…