[超详细]3种方法判断一个数是否为质数(Python)

这篇具有很好参考价值的文章主要介绍了[超详细]3种方法判断一个数是否为质数(Python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(发现好多博客对第三种进阶方法说的不明白,至少我是没完全看明白。后面结合自己的理解应该算是弄懂了,供大家参考,欢迎纠正。)

方法一:最暴力,最简单,也最耗时O(n)

思想:由素数的定义:一个数t,除了1和它本身,若没有其他因数,那么就称其为素数。因此循环i从2开始到t-1,依次判断t是否将i整除,若是则不为素数。

代码:

# 判断是否为质数
def is_zhishu(t):
    if t <= 1:
        # 1和0都不是质数
        return False
    for i in range(2, t):
        if t % i == 0:
            # 整除就是余数为0 只要有一个被整除 就找到因数 就不是质数
            return False
    return True

t = int(input())
print(is_zhishu(t))

方法二:一个数t,其必然可以拆解为,则其整数因数必然一个不大于,一个不小于.因此可以只搜索小于等于的因数即可,将上述代码小改一下即可。此时时间复杂度就只需要O().

代码:

# 判断是否为质数
import math
def is_zhishu(t):
    if t <= 1:
        # 1和0都不是质数
        return False
    sqrt_t = math.ceil(t**0.5)  # 这里用ceil的原因是要取整数才能输入range
    for i in range(2, sqrt_t):
        if t % i == 0:
            # 整除就是余数为0 只要有一个被整除 就找到因数 就不是质数
            return False
    return True

t = int(input())
print(is_zhishu(t))

方法三:时复<=O().

方法三基于如下一个规律:

首先。对于任一个自然数t,只要t>=5, 则可以写成6x-1,6x,6x+1,6x+2,6x+3,6x+4,...(x>=1)中的任一个。其次,针对上面的这种表达,依次看其是否是质数。

  • 6x-1: 不能确定(因为像35=6*6-1不是质数,但41=6*7-1是质数,因此暂时不能确定)
  • 6x: 因数可以是2,3,6,必定不是质数
  • 6x+1: 不能确定(因为像25=4*6+1不是质数,但37=6*6+1是质数,因此暂时不能确定)
  • 6x+2: =2(3x+1)因数可以是2,必定不是质数
  • 6x+3: =3(2x+1)因数可以是3,必定不是质数
  • 6x+4: =2(3x+2)因数可以是2,必定不是质数

因此,对于t>=5,只有t可以写成t=6x-1或者t=6x+1(x>=1)时才有可能是质数。那么判断t是否可以写成这两种形式该如何体现在代码上呢?

  • 首先我们知道代码中t%6 == 1,表示t = 6x+1(x>=0)的t都能识别出来,因此判断t>=5时可以被写成这种形成t=6x+1(x>=1)的就直接用t%6 == 1来判断即可,因为可以被识别出来即可。
  • 而t=6x-1(x>=1),这个-1的要如何识别出来呢?这个直接体现是体现不了在余数上的,因此需要转换一下,t=6x-1(x>=1)等价于t=6(x+1)-1(x>=0)=6x+5(x>=0). 类似上一个所说,t%6 == 5,表示t = 6x+5(x>=0)的t都能识别出来.因此这时只需要用t%6 == 5来识别t=6x-1(x>=1)这种情况即可。

所以代码中将可能是质数的先提取出来。即当t>=5时将不是质数的先判断为False。

前半部分:

if t <= 1 or t == 4:
    return False
elif t == 2 or t == 3:
    return True
    # 至此 先把t<5的情况全部讨论完,再看t>=5有规律的情况
elif t%6 != 1 and t%6 != 5:
    # 这里采用!= 就是将可能为质数的提取出来,!= 的就一定不是质数
    return False

那么接下来就是如何判断t=6x-1或者t=6x+1(x>=1)这两种形式到底是不是质数的问题了。首先我们采用方法二的大方向,这两种数如果不是质数,那么其必定会有一个因数不大于根号t,这样就找到了遍历时的右边界i = 根号t向上取整。那么i是从几开始,间隔又是几递增呢?直接搜会告诉你i从5开始,间隔是6,这是为什么?很多博客中说因为t=6x-1或者t=6x+1(x>=1),可是这个是t,又不是t的因数。那么为什么t的因数又只有6x-1或6x+1这两种形式呢?请看我细细道来。

  • 首先,t=6x-1或者t=6x+1(x>=1)这两种形式的数的因数也只可能为6x-1或者6x+1(x>=1),因为其他数的形式6x,6x+2,6x+3,6x+4(x>=0)(这里如果取6x则x>=1)要么一定有最小因数2要么一定有最小因数3,因此都不可能是t=6x-1或者t=6x+1(x>=1)的因数(这个前面分析过了,因为其不管怎么拆都拆不出2和3).因此对于t=6x-1或者t=6x+1(x>=1)这两种形式的数的因数也只可能为6x-1或者6x+1(x>=1)的形式[这里相当于从5开始了,是因为1不算因数,2和3刚已经说了不可能为t的因数了,4(因为可以拆成2)因此不可能是t的因数了]。所以现在就知道i从5开始!且因为6x-1或者6x+1(x>=1)都有可能成为t的因数,因此每遍历一次i就要有两次判断!(分别针对6x-1和6x+1的,i从5开始即每次取i时就是在判断6x-1(x>=1),取i+2时就是在判断6x+1(x>=1)),即t%i ==0 or t%(i+2) ==0,一旦有能被整除的就是False。现在i递增是6就很容易理解了,第一轮x=1时6x-1=5;判断完后第二轮x=2时6x-1 = 6(x-1)-1+6,因此每次递增6就可以将6x-1(x>=1)刚好全部判断完。
  • 没有然后了,已经结束,看不懂慢慢读多读几遍首先那一段就OK,不要着急。

方法三的完整代码:文章来源地址https://www.toymoban.com/news/detail-844441.html

import math
def is_zhishu(t):
    # 先把小于5的所有情况讨论完
    if t <= 1 or t == 4:
        return False
    elif t in (2,3):
        return True
    # 至此 t都是>=5的情况,这时就可以把t不是=6x-1,6x+1(x>=1)这两种情况过滤掉
    elif t%6 != 1 and t%6 != 5:
        return False
    # 此时基于t>=5基础上把有可能是质数的t=6x-1or6x+1(x>=1)的两种情况提取出来
    # 按照前面所说遍历i从5开始,递增6,至sqrt_t去寻找其因数,每轮要识别i(对应6x-1这种因数)和(i+2)(对应6x+1这种因数)
    sqrt_t = math.ceil(t**0.5)
    for i in range(5, sqrt_t, 6):
        if t % i == 0 or t %(i+2) == 0:
            return False
    return True

t = int(input())
print(is_zhishu(t))

到了这里,关于[超详细]3种方法判断一个数是否为质数(Python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言判断一个数是否是质数的几种常用方法(求100-1000以内的所有质数)

    要用代码判断一个数是否是质数,首先我们需要知道什么什么数称之为质数。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。 以下有三种方法判定质数: 通过从2到n-1每个数均整除

    2024年02月08日
    浏览(94)
  • python_输入任意一个数,判断是否是素数

    看了一下其他答案要不是格式不对run不出来,要不就是输入项验证不全,希望答案对大家有用。 

    2023年04月09日
    浏览(52)
  • C语言:判断一个数是否为素数(3种方法,含注释)

    首先要先明白素数的定义:除了1和本身之外,没有其他的因数的数,即不能被其他数整除。 同时要注意,1不是素数。 以下为判断素数的3个代码: 1.要注意给m赋初值是不能为1,因为1是任何数的因数,可以被任何数整除。若初值为1,则第一步就结束循环,所有的数输出结果

    2024年02月13日
    浏览(51)
  • 判断一个数是否是素数(Java版)

    目录 素数的定义 求解素数 素数判定法1: 遍历从2到n-1的所有数字,判断是否有可以被n整除的数,如果没有,则为素数。 优化法2: 判定的范围改为[2 -,n/2]。当 in/2 时,则判定为素数。 优化法3: 在Java中判定素数的范围也可以到sqrt(n),(对n开平方)。对应的函数为:Math.sqrt(n

    2024年02月16日
    浏览(71)
  • 【C语言】判断一个数是否为素数

    目录 判断一个数是否为素数 方法1  方法2    2.1 2.2 进阶:输出区间长度内的素数 “ 素数和质数没有区别 ,素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。比1大但不是素数的数称为合数,1和0既非素数也非合数。” 所谓素数

    2024年02月04日
    浏览(76)
  • C语言判断素数的三种方法 判断素数(质数)

    题目: 方法一:在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数 代码示例如下: 代码运行结果如下: 方法二:在2到n/2之间任取一个数,如果n能被整除则不是素数,否则就是素数  代码示例如下: 代码运行结果如下: 方法三:在2到sqrt(n)之间任取一个数,如

    2024年02月02日
    浏览(103)
  • 【C语言】判断一个数是否为素数(素数求解的N种境界)

    这是一篇关于素数的介绍,以及介绍判断是否为素数的一篇博客,我会将方法一一列举出来方便大家理解和观看。 🍊 我们在C语言的学习中会遇到各种各样的数学问题,每次遇到这些数学问题时,我们一定要学习如何用代码的方法表示出来,加深理解,并且强化自己的能力,

    2024年02月06日
    浏览(68)
  • C语言素数(质数)判断的三种方法

    本文介绍了判断素数的3种方法,从素数的概念分析,确定找到素数的几个必要条件,设计思路,并将代码进行优化。此外,还使用自定义函数的形式将同样的思路进行实现。 素数,就是仅能被自身和1整除的数字。 首先我们可以提取出判断素数的三个基本条件: 素数是整数

    2024年02月04日
    浏览(48)
  • Python-两种方法实现输出素数(质数)

    方案一: 程序的设计为: 1、设为被除数,取值范围可以自行设定,本例设为3-100;(1、2均不是素数) 2、设计为除数,除数的取值范围为除掉1和自身以及比自身大的数字(当被除数本身不为0时,除以比自身大的数余数一定不为零。) 3、在这两个前提下,先让固定,遍历范

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包