python 多种方式实现求素数
1,最偷懒的python实现方式,一行代码实现
>>> [x for x in range(2,101) if not[y for y in range(2,int(x**0.5+1)) if x % y ==0]]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>
2,低效率实现和函数实现
#!/usr/bin/env python #coding:utf-8 #多种方法实现求素数 #最简单的求素数方法,效率低 # n = 100 # lst = [] # count = 0 # for i in range(2,n): # for j in range(2,i): # if i % j ==0: # break # else: # lst.append(i) # count += 1 # print lst # print "素数个数:%s" %count #根据定义求素数 import math import time lst = [] count = 0 def prime(n): global count #global定义全局变量,不加全局变量,函数外定义变量,函数内修改了值,会报错 for i in range(2,n+1): for j in range(2,int(math.sqrt(i)+1)): if i%j == 0: break else: lst.append(i) count += 1 print lst starttime = time.clock() #程序开始时间 prime(10000) endtime = time.clock() #程序结束时间 print "素数的总个数为{}".format(count) print "求素数用时:{}".format(endtime - starttime)
3,筛选法实现
该方法代码还没有研究出来,后续会补充进来
所谓“筛选法”指的是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊的著名数学家。他采取的方法是,在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。
具体做法如下:
<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用4、5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如找1~50的素数,要一直进行到除数为47为止(事实上,可以简化,如果需要找1~n范围内素数表,只需进行到除数为n^2(根号n),取其整数即可。例如对1~50,只需进行到将50^2作为除数即可。)
如上算法可表示为:
<1> 挖去1;
<2> 用刚才被挖去的数的下一个数p去除p后面各数,把p的倍数挖掉;
<3> 检查p是否小于n^2的整数部分(如果n=1000, 则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
<4> 纸上剩下的数就是素数。