我正在尝试获得一个素数数组的总和,我知道有更优雅的方法可以做到这一点,并看到了这些解决方案的链接。
我的问题在这个特定的脚本中是错误的,我试图了解导致此代码失败的原因。
问题在于数字9,15和许多其他数据正被添加到素数数组中,即使它们都正确地未通过测试以检查它们是否为素数。尽管测试失败,我仍无法解决脚本中导致数字推送到数组的问题。同样,我并不是在寻找一种完全不同/更好的方法来总结质数,但是有些帮助确定这个脚本中究竟出错的是真的很感激。
function totalPrime(num) {
var nums = [];
var primes = [];
for (var i = 1;
(num - i) > 1; i++) {
nums.push(num - i);
}
nums.forEach(isPrime);
function isPrime(n) {
var a = [];
var test;
if (n === 1) {} else if (n === 2) {
primes.push(n);
} else {
for (var i = 1;
(n - i) > 1; i++) {
a.push(n - i);
}
a.forEach(function(x) {
if ((n % x) === 0) {
test = false;
} else {
test = true;
}
});
if (test) {
primes.push(n);
} else {}
};
}
console.log(primes.reduce(function(a, b) {
return a + b
}));
}
totalPrime(5);
与我用于调试的日志记录相同的脚本:
function totalPrime(num) {
var nums = [];
var primes = [];
for (var i = 1;
(num - i) > 1; i++) {
nums.push(num - i);
}
nums.forEach(isPrime);
function isPrime(n) {
var a = [];
var test;
if (n === 1) {
console.log(n + ' is NOT a prime number');
} else if (n === 2) {
console.log(n + ' IS a prime number');
primes.push(n);
} else {
for (var i = 1;
(n - i) > 1; i++) {
a.push(n - i);
}
a.forEach(function(x) {
if ((n % x) === 0) {
test = false;
console.log(n + ' % ' + x + ' equals 0');
console.log(x + ' fails check');
} else {
test = true;
console.log(n + ' % ' + x + ' does NOT equal 0');
console.log(x + ' passes check');
}
});
if (test) {
console.log(n + ' IS a prime number.');
primes.push(n);
} else {
console.log(n + ' is NOT a prime number.');
}
};
}
console.log(primes);
console.log(primes.reduce(function(a, b) {
return a + b
}));
}
totalPrime(5);
答案 0 :(得分:2)
每次测试中的test
值都会覆盖上一次检查。因此,实际上只有最后一次检查(除以2)变得相关,并且所有奇数素数都失败。
您可以通过将test
的默认值更改为true
来更正它,并删除代码test = true;
中的现有行。
更正的代码:
function isPrime(n) {
var a = [];
var test = true;
if (n === 1) {} else if (n === 2) {
primes.push(n);
} else {
for (var i = 1;
(n - i) > 1; i++) {
a.push(n - i);
}
a.forEach(function(x) {
if ((n % x) === 0) {
test = false;
}
});
if (test) {
primes.push(n);
}
};
}