zoukankan      html  css  js  c++  java
  • 判断一个数是不是质数(素数),3种方式介绍

    一、概念介绍

        大家中学都学过,就不过多介绍了,大致提两点:

        质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
        0和1既不是质数也不是合数,最小的质数是2
     

    二、方法介绍

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

    public static boolean isPrime(int n){
    if (n <= 3) {
    return n > 1;
    }
    for(int i = 2; i < n; i++){
    if (n % i == 0) {
    return false;
    }
    }
    return true;
    }
        这里特殊处理了一下小于等于3的数,因为小于等于3的自然数只有2和3是质数。

        然后,我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。

    2.初步优化

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

    public static boolean isPrime(int n) {
    if (n <= 3) {
    return n > 1;
    }
    int sqrt = (int)Math.sqrt(n);
    for (int i = 2; i <= sqrt; i++) {
    if(n % i == 0) {
    return false;
    }
    }
    return true;
    }
     

    3.继续优化

        我们继续分析,其实质数还有一个特点,就是它总是等于 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 两侧的数即可。

    public static boolean isPrime(int num) {
    if (num <= 3) {
    return num > 1;
    }
    // 不在6的倍数两侧的一定不是质数
    if (num % 6 != 1 && num % 6 != 5) {
    return false;
    }
    int sqrt = (int) Math.sqrt(num);
    for (int i = 5; i <= sqrt; i += 6) {
    if (num % i == 0 || num % (i + 2) == 0) {
    return false;
    }
    }
    return true;
    }
        对于输入的自然数 n 较小时,也许效果不怎么明显,但是当 n 越来越大后,该方法的执行效率就会越来越明显了。

  • 相关阅读:
    ubuntu11.04更改默认JDK
    10个实用的jQuery交互/通信插件和教程
    jquery 使用方法
    在没有安装 ASP.NET MVC3 的服务器上运行 MVC3
    固定 vs. 流动 vs. 弹性:哪种布局更适合你?[SM]
    提升设计品质的8种布局方案[SM]
    Ubuntu 手动安装JDK
    十个简单好用的设计技巧[SM]
    jQuery VSDoc下载地址
    Ubuntu 配置Apache+PHP+MySQL
  • 原文地址:https://www.cnblogs.com/ffaiss/p/11398138.html
Copyright © 2011-2022 走看看