我是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);
答案 0 :(得分:8)
声明“但它正在产生额外数字”不太正确。您生成的数组在开头包含最多100个数字。问题是并非所有非素数都被删除。
为什么呢?因为您在迭代时修改数组。结果是一些条目不会被检查,它们将被跳过。
示例:
想象一下数组
var num = [2,3,4,5,6,7,8,9,10,11];
让i
为7
,因此我们正在测试num[7] = 9
。 9
不是素数,因此它会从数组中删除,然后看起来像
var num = [2,3,4,5,6,7,8,10,11];
在下一次迭代中,i
为8
,我们正在测试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;
}
}
我没有测试过,所以不确定它是否有效......