判断一个数是不是质数(素数),3种方式介绍

一、概念介绍大家中学都学过,就不过多介绍了,大致提两点:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。 0和1既不是质数也不是合数,最小的质数是2二、方法介绍1.最直观,但效率最低的写法publicstaticbooleanisPrime(intn){if(n<=…

大家好,又见面了,我是你们的朋友全栈君。

一、概念介绍

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

  •     质数又称素数。一个大于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 越来越大后,该方法的执行效率就会越来越明显了。
    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124563.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • usb转rs485测试软件,usb转rs485驱动程序

    usb转rs485测试软件,usb转rs485驱动程序usb转rs485线必须安装usb转rs485驱动程序才可以正常使用,而本次发布的这个usb转rs485驱动,就是那个东东啦。USB转485驱动程序官方版发布。。驱动压缩包中此外还包含了USB编程电缆驱动程序安装说明-485.doc,喜欢的小伙伴可以下载使用。USB转RS485串口驱动PL2303,适合WIN7/WINXP/LINUX等系统。usb转485转换器线驱动安装方法:1、在安装前可以…

    2022年4月28日
    32
  • java代码生成器,springboot代码生成器,加入oracle支持

    java代码生成器,springboot代码生成器,加入oracle支持续接上一篇博客,今天生成器又加入了oracle的支持,界面做了些许的微调,先看一下效果吧比之前好看了一点点吧,然后我们进行oracle配置在这里随便选了公司局域网oracle数据库中的一张表,名字有点长,然后点击数据项配置在这里对交互进行了优化,因为首次连接数据库有时会花费几秒的时间,加了一些提示,如果出现错误,也会出现友好提示,在这里就不一…

    2022年5月29日
    27
  • 语义分割最新算法_nonnegative integers

    语义分割最新算法_nonnegative integers翻译来自:https://gist.github.com/khanhnamle1994/e2ff59ddca93c0205ac4e566d40b5e88语义分割方面的资源:https://github.com/mrgloom/awesome-semantic-segmentation1.什么是语义分割语义分割是当今计算机视觉领域的关键问题之一。从宏观上看,语义分割是一项高层次的任务,…

    2022年4月19日
    115
  • sql报错将截断字符串或二进制数据_sql根据分隔符截取字符串

    sql报错将截断字符串或二进制数据_sql根据分隔符截取字符串今天使用数据库的时候,遇见这样的错误:成因分析:自己在设计数据库的时候,将表的某些属性的域的长度设置的小了:而我在填写的对应的数据长度是超过了数据库属性长度的设计,这样,在将数据录入数据库的时候,会将数据截断。解决方案:扩充数据库对应属性的长度:~~~~~~~~~~完美解决了~~~~~~~~~~~~~~~~~~~~

    2022年10月7日
    0
  • 行存储和列存储的优缺点

    行存储和列存储的优缺点按行存储:数据按行存储在底层文件系统中,通常,每一行会被分配固定的空间优点:有利于增加、修改整行记录等操作,有利于整行数据的读取操作缺点:单列查询时,会读取一些不必要的数据按列存储:数据以列为单位,存储在底层文件系统中优点:有利于面向单列数据的读取/统计等操作缺点:整行读取时,可能需要多次I/O操作…

    2022年7月14日
    20
  • ES6 数组方法归纳整理

    ES6 数组方法归纳整理ES6操作数组方法1.判断是否为数组 letarr=[1,2,3] console.log(Array.isArray(arr))//true console.log(Array.isArray([]))//true2.创建数组newArray()创建数组如果使用Array构造函数传入一个数值型的值,那么数组的长度length属性会被设置为该值; letitems=newArray(2); console.log(items.length);//2

    2022年6月9日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号