2015-07-21 24 views
1

我正在写j/s中的素数检查器,我想知道为什么当我测试55时,我的回报是真的......对于其他所有情况,我只检查55 ,有人能告诉我我错了哪里?在JavaScript中的主要因素,为什么这种情况下不工作?

var isPrime = function(num){ 

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

      if((num/i) % i === 0){ 
       return false; 
      } 
       i++ 
     } 
     return true; 
    } 

}; 

在此先感谢,并为noobness道歉!

回答

2
 if((num/i) % i === 0){ 
      return false; 
     } 

这是什么情况? 难道不应该是

 if(num % i === 0){ 
      return false; 
     } 
1

正如@Andrey指出的那样,你的while循环内if说法是不正确的。对于55在i=5你应该错误55为素数,但55/5 % 5 == 1也可以使用==而不是===逻辑等于,因为===检查两个值和类型是否相等,在这里没有必要。

+0

哦!感谢您指出这一点,必须误解代码学院,哈哈。 – hackrnaut

+0

哈哈,不用担心。我甚至都不知道JavaScript中有一个'==='逻辑运算符,所以我在w3学校检查过它,并且读到'=='很类似,但也检查对象类型。 –

0

试试这个。

var isPrime = function isPrime(value) { 
    var i = 2; 
    for(i; i < value; i++) { 
     if(value % i === 0) { 
      return false; 
     } 
    } 
    return value > 1; 
}; 
0

即使你的bug可以得到解决,我建议你考虑一下其他一些方面来优化代码:

  1. 澄清你的角落的情况:在开始的时候,检验N- < 2 - >返回false。至少对于数学理论来说,素数被定义为大于1的自然数,所以1根据定义不是所有负数的素数。您的代码不会正确处理负数。
  2. 您不必检查所有最多n-1的除数。你显然可以在n/2停止检查,但是甚至有更严格的界限证明,这意味着如果我是对的,你可以在√ n停止检查。为了进一步优化,您不必检查大于2的除数。

    else { 
        var i = 3; 
        while (i < num/2) { 
        if(num % i == 0) { 
         return false; 
        } 
        i+=2; 
        } 
        return true; 
    } 
    

    有关质数测试的详细信息,请参阅https://en.wikipedia.org/wiki/Primality_test

P.S:我刚刚在文本框中写了代码,但看起来好像可能有效。

相关问题