卡住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];
让i
是7
,所以我们正在testingnum[7] = 9
。 9
不是素数,所以它被从数组中删除,然后看起来像
var num = [2,3,4,5,6,7,8,10,11];
在下一个迭代中, i
是8
,我们正在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它,所以不知道它是否工作…