python判断素数_ghpython_判断素数_改进版

今天咱们继续来学一个python小例子,其实在上一篇的ghpython中有学过,就是判断一个自然数是否是素数,如果是输出为True,如果不是,输出为否。

这么简单的一个问题,今天为啥又要单独拿出来讨论呢,因为对于之前的程序有两点十分开脑洞的改进的地方,看完之后,我是感慨,码农的脑子真的是个好东西。

之前咱们的除数遍历到的终止值是x/2,实际可以遍历到sqrt(x),另外遍历的步进值可以为6,极大的优化算法。

e4bf07033d226dabc16c8f46f548ba7b.png

435ed0660ca957973b68a4030f784c99.png

#判断素数_改进版"""最直观的判断一个数是否为素数,将除数从2遍历到被除数的一半,如果发现能被整除的数,则判定该数为素数,但其实该算法完全可以被优化,首先并不需要遍历到x/2,如果一个数不为素数,那他必然至少能被两个数整除,那么必然是一个小于sqrt(x),一个大于sqrt(x)所以除数只需从2遍历到sqrt(x)即可另外一种更高阶的改进思路,任何一个自然是必然是6x,6x+1,6x+2,6x+3,6x+4,6x+5其中的一种形式,而6x,6x+2,6x+3,6x+4肯定能被2或3整除,也就是其肯定不为素数,那么也就是说只要是素数,他必然是与6x相邻的两个数6x+1或6x-1(6x+5)的形式,那么在遍历除数的时候,就可以以6为步进值,进一步优化算法效率。"""import random as randdef prime_num(x):    #如果x为1,2,3,则其为素数    if x<=3:        return True    #如果一个数除6取余,余数既不是1也不是5,也就是他不是6x相邻的两个数,    #他必然不是素数    if x%6 !=1 and x%6 !=5:        return False    #如果程序运行到这一步,就意味着该数必然与6x相邻,是素数必然相邻,    #相邻不一定是素数,所以需要进一步判断    #最小的6x-1形式的值为5,从5开始,步进值设置为6进行遍历,分别取余i和(i+2)    #出现能被整除的情况,x则肯定不为素数    for i in range(5,int(pow(x,0.5)+1),6):        if x%i==0 or x%(i+2)==0:            return False    return True#构建列表,并以此输出每个元素是否为素数的判定结果lst=rand.sample(range(100),12)a=lstfor j in lst:    print(prime_num(j))

欢迎关注「颜犀设」知乎专栏和知识星球。

e63fa90c3898c304c867d9ca377a10a4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值