我目前正面临着这样的挑战:https://www.freecodecamp.org/challenges/sum-all-primes
我试图把所有素数从0加到10。
我有一个函数来检查这个数字是否是素数。如果我通过9,它会返回false,这很好。
但是,当我用while循环从10递减并将9传递到函数时,它似乎是返回true并将其添加到我的求和中。因此,当10中所有素数之和为17时,我得到了24的结果!这是因为它将9作为素数相加。
这是我的代码,我一定是漏掉了什么东西,但我能弄清楚!
function sumPrimes(num) {
function isPrime() {
for (var i = 2; i <= num; i++) {
if (num % i === 0) {
return false;
}
return num !== 1;
}
}
// alert(isPrime(9)); // returns false
var count = 0;
while (num >= 0) {
if (isPrime(num)) {
count += num;
console.log(count);
}
num--;
}
console.log(count);
}
sumPrimes(10);
发布于 2017-09-02 14:46:37
首先,如果不小于num的数除以该数字,则需要从isPrime()返回true,因此从for循环中移除return num !== 1;,并在循环后添加return true。此外,您还在函数isPrime()中运行循环,直到数字num为止,因为每个数字都可以被自身整除,所以函数将对每个数字返回false,将循环条件更改为i<num。还请注意,1不是素数,所以您不需要在和中添加它。
function sumPrimes(num) {
function isPrime(num){
if(num === 1 ) //since 1 is neither prime nor composite.
return false;
for (var i = 2; i < num; i++) {
if (num % i === 0) {
return false;
}
}
return true;
}
// alert(isPrime(9)); // returns false
var count = 0;
while (num >= 0) {
if (isPrime(num)) {
count += num;
alert(count);
}
num--;
}
console.log(count);
}
sumPrimes(10);
发布于 2017-09-02 14:46:36
尝试修改以下代码片段
function isPrime() {
for (var i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {return false;}
}
return true;
}使用Math.sqrt(num)作为上限将提高时间复杂度并加快大数字的计算速度(请参阅我的在线素数计算器,最多18位,通过一些附加优化:http://examn8.com/Primes.aspx )实现这个算法。
希望这能帮上忙。
https://stackoverflow.com/questions/46014880
复制相似问题