2016-07-28 60 views
2

我一直试图通过这么长时间的挑战,尽管在线阅读了多个解决方案和建议,但我似乎无法正确应用它。Javascript素数检查

这些指令是“定义一个函数isPrime,它接受一个整数参数并根据整数是否为素数返回true或false”。

我已经尝试了很多东西,但是这是最远的我已经能够得到:

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else return true; 
} 

但后来有人告诉我:“9是不是素数”

任何帮助,将不胜感激,谢谢!

+0

步骤通过您的代码。由于'num'不小于'1',也不等于'2',所以你打了循环。所以它测试'9%2'是'1',所以它碰到'else','返回true';声称9是质数。显然,它不是。 –

回答

3

您应该避免else情况,并仅在for循环完成后才返回。尽管可以通过更新条件来减少回路计数到i <= Math.sqrt(num)(因为@PatrickRoberts建议)。

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    // storing the calculated value would be much 
    // better than calculating in each iteration 
    var sqrt = Math.sqrt(num); 

    for (var i = 2; i <= sqrt; i++) 
    if (num % i === 0) return false; 
    return true; 
} 

FYI:在环路num % i === 09 % 2)的第一次迭代的代码将是false,它会返回else语句(true)。

+2

现在让我们来谈谈[Eratosthenes的筛选器](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)...因为我们面对它,这是一个可怕的低效率的实现 –

+1

谢谢你们,这个工程很棒! –

+1

希望我可以多劳多得,非常好的答案。 –

4

问题在于for循环中的else return true;

在第一次迭代中,i为2,在您检查9 % i不是0之后,您执行else块和return true

在所有迭代失败之前,您都不应该使用return truereturn false

+0

感谢您解释返回真实位,我终于明白了! –

-1

应该有继续关键字在你的for循环(或省略else语句),但两个if和else你有回报关键字。所以,你的for循环迭代只对i = 2

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else continue; // omittable 

    return true; 
} 

你可以做很多事情来增加这个 代码功能/性能。例如i < num条件在您的for循环允许非常宽的范围内 。数量的平方根将足够用于更高的边界。

+2

,“else continue”在这里没用。 –

+0

是的,我现在但我写这样表示差异。 –

0
function primeNo(){ 
//"number1" is "ID" of HTML input block. 
var num2 = document.getElementById("number1").value; 
var dev = num2/2; 
var i; 
for(i=2; i < dev ; i++){ 
    if(num2%i == 0){ 
     //"ans1" is "ID of <p> where ans needs to display" 
     document.getElementById("ans1").innerHTML = "Not a Prime No"; 
     break; 
    } 
    else{ 
     document.getElementById("ans1").innerHTML = "Prime No"; 
    } 
} 

}

+0

由于“1”不在素数列表中,所以循环以2开头。如果一个数字可以完全整除直到其数值的一半,那么它就不是素数。如果提醒是“0”,则使用“休息”来逃脱。 –