在 Javascript 中通过埃拉托色尼筛法对素数求和:仅当参数为素数时失败
Sum primes via Sieve of Eratosthenes in Javascript: Fails only if argument is prime
我的筛法本身似乎运行良好,只要最后一个值本身不是素数,求和函数 return 就是正确的结果。奇怪的是,如果我直接 return 它,我可以看到在 true/false 数组中适当地记录了素数,但我似乎无法为了求和的目的而真正得到它。结果,运行 这个 Sieve 在 10 returns 17(正确),但是 运行 它在 37 returns 160 而不是 197。运行 它在 5 returns 5 而不是 10,依此类推。
function sumPrimes(n) {
var primArr = [];
var primSum = 0;
for (var i = 2; i < n; i++) {
primArr[i] = true;
}
//sieve
for (i = 2; i * i < n; i++) {
if (primArr[i]){
for (var j = 0; i * i + i * j < n; j++) {
primArr[i * i + i * j] = false;
}
}
}
for (i = 2; i <= n; i++) {
if (primArr[i]) {
primSum += i;
}
}
return primSum;
}
在所有 for
循环中放置条件 <= n
,因为您还想考虑 n
本身。
请注意,如果将中间部分更改为这样可以节省一些计算:
for (var i = 2, sqrtN = Math.sqrt(n); i <= sqrtN; i++) {
if (primArr[i]){
for (var j = i * i; j <= n; j += i) {
primArr[j] = false;
}
}
}
我的筛法本身似乎运行良好,只要最后一个值本身不是素数,求和函数 return 就是正确的结果。奇怪的是,如果我直接 return 它,我可以看到在 true/false 数组中适当地记录了素数,但我似乎无法为了求和的目的而真正得到它。结果,运行 这个 Sieve 在 10 returns 17(正确),但是 运行 它在 37 returns 160 而不是 197。运行 它在 5 returns 5 而不是 10,依此类推。
function sumPrimes(n) {
var primArr = [];
var primSum = 0;
for (var i = 2; i < n; i++) {
primArr[i] = true;
}
//sieve
for (i = 2; i * i < n; i++) {
if (primArr[i]){
for (var j = 0; i * i + i * j < n; j++) {
primArr[i * i + i * j] = false;
}
}
}
for (i = 2; i <= n; i++) {
if (primArr[i]) {
primSum += i;
}
}
return primSum;
}
在所有 for
循环中放置条件 <= n
,因为您还想考虑 n
本身。
请注意,如果将中间部分更改为这样可以节省一些计算:
for (var i = 2, sqrtN = Math.sqrt(n); i <= sqrtN; i++) {
if (primArr[i]){
for (var j = i * i; j <= n; j += i) {
primArr[j] = false;
}
}
}