求100以内的质数

来源:互联网 发布:异星工厂物流网络 编辑:程序博客网 时间:2024/05/01 21:19

求100以内的质数


By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢。


描述:

输出100以内的所有素数,素数之间以一个空格区分

分析:

首先了解下素数:素数(prime number)又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被整除以其他自然数(质数),换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。最小的质数是2。

 

程序1:使用试除法,看看比n小的数中有没有n的因数,如果没有,那么该数就是素数。

def output_all_prime():for i in range(2, 101):flag = Truefor j in range(2, i):if i%j == 0:flag = Falsebreakif flag:print i,


输出:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 8997

程序2:升级版试除法,我们没必要对小于n的所有整数进行试除法,只要试除2到根号n就行了。因为因数都是成对出现的。成对的因数,其中一个必然小于等于根号n,而另一个一定大于根号n。

def is_prime_number(n):i = 2sqrtn = int(pow(n, .5))flag = Truewhile i <= sqrtn:if n%i == 0:flag = Falsei += 1if flag:print n,def output_all_prime():[is_prime_number(x) for x in range(2, 101)] 

程序3:更pythonic的做法:

def output_all_prime5():print ' '.join(['%s' % x for x in range(2, 101) if not [y for y in range(2, int(pow(x, .5) + 1)) if x%y == 0]])#或者print ' '.join([str(i) for x in range(2, 101) if not [y for y in range(2, int(pow(x, .5) + 1)) if x%y == 0]])


到这,试除法结束。

下面学习求质数算法的N种境界 (N > 10)文章并给出相关python代码。


程序4:使用空间换时间法。

介绍:“尝试从 3 到√x 的所有奇数,还是有些浪费。比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3,5,7,9。但是你发现没有,对9的尝试是多余的。不能被3整除,必然不能被9整除......顺着这个思路走下去,这些程序猿就会发现:其实,只要尝试小于√x 的质数即可。而这些质数,恰好前面已经算出来了(是不是觉得很妙?)”

我们用一个数组prime_list来保存所有的质数,每次有质数出现,就将其添加到数组中去。然后每次判断就判断n能否被保存起来的这些质数想整除就行了。


def output_all_prime6():'境界五'prime_list = [2]for i in range(3, 101):flag = Truesqrtn = int(pow(i, .5))for j in prime_list:if sqrtn >= j:if i%j ==0:flag = Falsebreakelse:breakif flag:prime_list.append(i)print ' '.join([str(i) for i in prime_list])

程序5:埃拉托斯特尼筛法(可以维基百科)。

介绍:首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......
  上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。图片地址。



def output_all_prime7_1():'埃拉托斯特尼筛法'ori_list = [True for i in range(0, 101)]ori_list[0], ori_list[1] = False, Falsei = 2n = 100while i*i <= n:for j in range(2, n):if i*j <= n:ori_list[i*j] = Falseelse:breakwhile True:i += 1if i*i <= n and ori_list[i] == False:continueelse:breakfor i,num in enumerate(ori_list):if num == True:print i,


0 0
原创粉丝点击