陈述“但它正在产生额外的数字”并不完全正确。您在开始时生成了包含最多 100 的所有数字的数组。问题是并非所有非质数都被删除。
为什么?因为您在迭代数组时正在修改数组。结果是某些条目不会被检查,它们将被跳过。
例子:
想象一下数组
var num = [2,3,4,5,6,7,8,9,10,11];
Let i
be 7
,所以我们正在测试num[7] = 9
。9
不是素数,因此它从数组中删除,然后看起来像
var num = [2,3,4,5,6,7,8,10,11];
在下一次迭代i
中8
,我们正在测试num[8] = 11
。注意如何10
没有测试?最初10
是在 index8
但由于我们删除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。