zoukankan      html  css  js  c++  java
  • 判断一个数是不是质数

    概念介绍

    质数是指在大于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
    }
    
  • 相关阅读:
    网页、JavaScript 数据类型
    网页javascript
    网页CSS
    使用ButterKnife无法inject view的解决办法
    项目管理实践 -- 健身小管家(Fitness housekeeper)的管理
    XML的序列化与反序列化
    JAVA虚拟机JVM-7.多线程常见问题刨析
    JAVA虚拟机JVM-6.锁优化
    JAVA虚拟机JVM-5.多线程以及锁
    JAVA虚拟机JVM-4.线程模型
  • 原文地址:https://www.cnblogs.com/superlizhao/p/12274081.html
Copyright © 2011-2022 走看看