判断一个数是不是质数

概念介绍

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

代码一

最直观,但效率最低的写法

function isPrime(n) {
  let flag = n < 2 ? false : true;
  for (let i = 2; i < n; i++) {
    if (n % i == 0) {
      flag = false;
      break;
    }
  }
  return flag
}

代码二

假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我们可以改进上述方法优化循环次数。

function isPrime(n) {
  let flag = n < 2 ? false : true;
  for (let i = 2, max = Math.sqrt(n); i <= max; i++) {
    if (n % i == 0) {
      flag = false;
      break;
    }
  }
  return flag
}

代码三

其实质数还有一个特点,就是它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。

如何论证这个结论呢,其实不难。首先 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数即可。

function isPrime(n) {
  let flag = true;
  //对5以下的数特殊处理
  if (n == 2 || n == 3) {
    return true;
  }
  // 不在6的倍数两侧的一定不是质数
  if (n % 6 !== 1 && n % 6 !== 5) {
    return false
  }
  for (let i = 5, max = Math.sqrt(n); i <= max; i += 6) {
    if (n % i == 0 || n % (i + 2) == 0) {
      flag = false;
      break;
    }
  }
  return flag
}
原文地址:https://www.cnblogs.com/superlizhao/p/12274081.html