javascript中的主要因素,为什么这种情况不起作用?

时间:2015-07-21 11:55:26

标签: javascript algorithm primes

我正在用j / s写一个素数检查器,我想知道为什么当我测试55时我为什么会得到回报...它似乎适用于所有其他情况我检查的不是55,有人可以告诉我哪里出错了吗?

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道歉!

4 个答案:

答案 0 :(得分:2)

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

这是什么情况? 不应该

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

答案 1 :(得分:1)

就像@Andrey指出的那样,if循环中的while语句不正确。对于i=5处的55,你应该得到55为素数的假,但是55/5 % 5 == 1此外,你可以仅使用==而不是===来获得逻辑等号,因为===检查值和类型是否相等,这在此是不必要的。

答案 2 :(得分:0)

试试这个。

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

答案 3 :(得分:0)

即使您的错误可能已经解决,我也建议您考虑其他一些方面来优化您的代码:

  1. 澄清您的角落案例:在开始时,检查n&lt; 2 - &gt;返回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

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