javascript 中的质因数,为什么这种情况不起作用?

Prime factor in javascript, why is this case not working?

我正在 j/s 中编写一个素数检查器,我想知道为什么当我测试 55 时我的 return 是真的...它似乎工作正常我检查的所有其他情况都不是 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;
    }

};

在此先感谢并为菜鸟道歉!

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

这是什么情况? 不应该

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

正如@Andrey 指出的那样,您在 while 循环中的 if 语句不正确。对于 i=5 处的 55 你应该得到 false 因为 55 是素数,但是 55/5 % 5 == 1 你也可以只使用 == 而不是 === 来表示逻辑相等,因为 ===检查值和类型是否相等,这里不需要。

试试这个。

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

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

  1. 澄清你的极端情况:一开始,检查 n<2 -> return 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: 我刚刚在文本框中写了这里的代码,但看起来它可能有效。