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
    }
    
  • 相关阅读:
    国内源 maven 配置 + SSM 脚手架 整合
    Google XSS 小游戏 答案
    鉴影记录
    记录 完美解码 配置
    HttpCanary 破解 可注入 【拒绝度盘】【20200606有效】
    MyBatisCodeHelper-Pro插件破解版[2.8.2] 【拒绝度盘】
    博客园主题
    wdcp后台登陆访问失败处理方法
    分享一下自己渗透挖洞方法与思维
    服务器安装宝塔linux系统控制面板
  • 原文地址:https://www.cnblogs.com/superlizhao/p/12274081.html
Copyright © 2011-2022 走看看