如何判断一个数是否为素数(判断一个数为素数)

目录1.什么是质数?2.如何判断是否为质数?方法1方法2方法3方法41.什么是质数?首先来看质数的概念:质数(Primenumber),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)图1数字12不是质数,而数字11是质数如上图所示,数字12可以将每4个分成一组,…

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

目录

1.什么是质数?

2.如何判断是否为质数?

方法1

方法2

方法3

方法4


1.什么是质数?

首先来看质数的概念:

质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)

 

如何判断一个数是否为素数(判断一个数为素数)
图1  数字12不是质数,而数字11是质数

如上图所示,数字12可以将每4个分成一组,一共3组;而数字11将每4个、每5个、每3个分成一组都无法全部分完,而有剩余,因此将数字11称为质数。

 

2.如何判断是否为质数?

质数的特点如下:

一个自然数(如1、2、3、4、5、6等)若恰有两个正约数(1及此数本身),则称之为质数。

方法1

根据质数的约数只有1和本身这一特点,可以首先想到最直观的方法。第一种方法就是判断一个数是否能被比它小的数整除

方法1的时间复杂度是O(n)。

public static boolean isPrime(int n){
    //n<=3时,质数有2和3
    if (n <= 3) {
        return n > 1;
    }
    //当n>3时,质数无法被比它小的数整除
    for(int i = 2; i < n; i++){
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

方法2

当一个数不是质数时,必定存在两个约数,一个大于等于sqrt(n),另一个小于sqrt(n)。利用这种特性,可以对方法1进行改进,只判断数n能否被小于sqrt(n)的数整除。

方法2的时间复杂度是O(sqrt(n))。

如何判断一个数是否为素数(判断一个数为素数)
图2  筛选判断集,只选择小于等于sqrt(n)的集合

 

public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    //判断一个数能否被小于sqrt(n)的数整除
    int sqrt = (int)Math.sqrt(n);
    for (int i = 2; i <= sqrt; i++) {
        if(n % i == 0) {
            return false;
        }
    }
    return true;
}

方法3

任一偶数一定能分解为2和其他偶数/奇数的积,因此一个数不能被2整除,那么这个数一定不能被其他偶数整除。利用这个特点,可以对方法2进行改进,判断数n能否被小于sqrt(n)的奇数整除。

方法3的时间复杂度是O(sqrt(n)/2)。

如何判断一个数是否为素数(判断一个数为素数)
图3  进一步筛选判断集,只选择小于等于sqrt(n)的奇数
public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    //只需判断一个数能否被小于sqrt(n)的奇数整除
    int sqrt = (int)Math.sqrt(n);
    for (int i = 3; i <= sqrt; i += 2) {
        if(n % 2 == 0 || n % i == 0) {
            return false;
        }
    }
    return true;
}

方法4

质数的分布具有特点,经过证明可以得到,(大于等于5的)质数一定和6的倍数相邻,一定是6x-1或6x-1。利用这种特性。可以对整数进行筛选,只判断那些是6x-1或6x-1的整数是否为质数。

如何判断一个数是否为素数(判断一个数为素数)
图4  筛选数据集,只选择6的倍数相邻的数

证明过程如下:

令x≥1,将大于等于5的自然数表示如下: ······6x-1,6x,6x+1,6x+2,6x+3,6x+4······(相邻6个数为一组)

在以上的数字中,6x、6x+2和6x+4是偶数,一定不是质数;6x+3可以分解为3(2x+1),不是质数,因此质数只能是6x-1和6x+1。

public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    // 只有6x-1和6x+1的数才有可能是质数
    if (n % 6 != 1 && n % 6 != 5) {
        return false;
    }
    // 判断这些数能否被小于sqrt(n)的奇数整除
    int sqrt = (int) Math.sqrt(n);
    for (int i = 5; i <= sqrt; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

 

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

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

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


相关推荐

  • Option 82在校园网的应用与实现(转)[通俗易懂]

    Option 82在校园网的应用与实现(转)[通俗易懂]作者:南京政治学院上海分院教育技术中心陈晓晖经过近几年的建设,各高校大体完成了校园网基础环境建设,将建设重点逐步转移到信息资源与应用服务上,校园网的安全也越来越受重视,迫使网络管理员比以往更加需要在加强网络安全和便于使用之间找到一个平衡点。笔者认为在具备802.1x认证的硬件条件下,引入Option82构建一个权限分配清晰的校园网是一项可行的措施。 DHCPOption82说明和关键点

    2022年9月25日
    0
  • 怎么将python代码编译_python怎么编译运行

    怎么将python代码编译_python怎么编译运行有时为了一些机密,不方便公开python源码,所以需要以编译方式进行部署。这里主要介绍以.pyc的方式。1、生成单个文件:(1)python-mxx.py(2)在python编译器中进行:importpy_compilepy_compile.compile(‘路径’)2、批量生成文件:importcompileallcompileall.compile_dir(r’/pat………

    2025年7月20日
    1
  • 手把手教你Python学习!(附流程图)「建议收藏」

    手把手教你Python学习!(附流程图)「建议收藏」关注公众号:Python爬虫数据分析挖掘,免费获取更多开源项目源码对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大

    2022年7月1日
    22
  • vs2010 序列号「建议收藏」

    vs2010 序列号「建议收藏」序列号:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP从网上搜的,经测试,可用信息来源:http://blog.163.com/ldy_3881685/blog/static/32380136201031333921823/示意图环境windows7旗舰中文+vs2010旗舰英文,vs2010自己从官网下载试用版本,然后输入序列号的步骤同vs200…

    2022年7月20日
    12
  • python 正则 括号_js正则匹配0个或多个空格

    python 正则 括号_js正则匹配0个或多个空格\d匹配一个数字\w匹配一个字母或数字.匹配任意字符*表示任意个字符(包括0个),+表示至少一个字符?表示0个或1个字符^表示行的开头$表示行的结束\s匹配一个空格(也包括Tab等空白符)\s+表示至少有一个空格|A|B可以匹配A或B,所以(P|p)ython可以匹配’Pyth…

    2025年6月3日
    0
  • Java基础入门笔记04——方法调用,方法重载,命令行参数,可变参数,多维数组,Arrays类,冒泡排序,矩阵的压缩存储

    Java基础入门笔记04——方法调用,方法重载,命令行参数,可变参数,多维数组,Arrays类,冒泡排序,矩阵的压缩存储JAVA基础04方法System.out.println()——类.对象.方法out是标准输出对象方法是语句的集合,用于执行一个功能——类似C语言中的函数public class Demo01 { public static void main(String[] args) { //main就是一个方法————由java虚拟机调用 //void 是返回类型 int sum = add(1, 2); System.out.pri

    2022年8月8日
    3

发表回复

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

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