今天咱们继续来学一个python小例子,其实在上一篇的ghpython中有学过,就是判断一个自然数是否是素数,如果是输出为True,如果不是,输出为否。
这么简单的一个问题,今天为啥又要单独拿出来讨论呢,因为对于之前的程序有两点十分开脑洞的改进的地方,看完之后,我是感慨,码农的脑子真的是个好东西。
之前咱们的除数遍历到的终止值是x/2,实际可以遍历到sqrt(x),另外遍历的步进值可以为6,极大的优化算法。
#判断素数_改进版"""最直观的判断一个数是否为素数,将除数从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))
欢迎关注「颜犀设」知乎专栏和知识星球。