js面试题之判断是否为质数

写一个isPrime函数,当其为质数时返回true,否则返回false。

有点学习到了,我原来的实现方法就是循环2到num,判断能不能整除,都不能整除则为素数(质数)。

原博主的算法思路:

我认为这是面试中最常见的问题之一。然而,尽管这个问题经常出现并且也很简单,但是从被面试人提供的答案中能很好地看出被面试人的数学和算法水平。

首先,因为JavaScript不同于C或者Java,因此你不能信任传递来的数据类型。如果面试官没有明确地告诉你,你应该询问他是否需要做输入检查,还是不进行检查直接写函数。严格上说,应该对函数的输入进行检查。

第二点要记住:负数不是质数。同样的,1和0也不是,因此,首先测试这些数字。此外,2是质数中唯一的偶数。没有必要用一个循环来验证4,6,8等偶数是否为质数。再则,如果一个数字不能被2整除,那么它不能被4,6,8等偶数整除。因此,你的循环必须跳过这些数字。如果你测试输入偶数,你的算法将慢2倍(你测试双倍数字)。可以采取其他一些更明智的优化手段,我这里采用的是适用于大多数情况的。例如,如果一个数字不能被5整除,它也不会被5的倍数整除。所以,没有必要检测10,15,20等等。

最后一点,你不需要检查比输入数字的开方还要大的数字。我感觉人们会遗漏掉这一点,并且也不会因为此而获得消极的反馈。但是,展示出这一方面的知识会给你额外加分。

总结一下思路就是:

  1. 输入测试
  2. 除了2以外偶数不需要验证是否为质数
  3. 验证奇数时,没必要循环偶数去看是否能被除
  4. 循环的长度不需要比数字的开方还大,因为后面的类似于倒过来在计算,比如1x3和3x1
function isPrime(number) {
     
   if (typeof number !== 'number' || !Number.isInteger(number)) {
     
      return false;
   }
   if (number < 2) {
     
      return false;
   }
   if (number === 2) {
     
      return true;
   } else if (number % 2 === 0) {
     
      return false;
   }
   var squareRoot = Math.sqrt(number); //平方根,比如Math.sqrt(9)为3
   for(var i = 3; i <= squareRoot; i += 2) {
     
      if (number % i === 0) {
     
         return false;
      }
   }
   return true;
}

其中代码中用到了Number.isInteger(),该方法是ES6方法,用来判断一个值是否为整数。

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false

需要注意的是,在JavaScript内部,整数和浮点数是同样的储存方法,所以25和25.0被视为同一个值。

你可能感兴趣的:(算法)