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 = True for j in range(2, i): if i%j == 0: flag = False break if 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 = 2 sqrtn = int(pow(n, .5)) flag = True while i <= sqrtn: if n%i == 0: flag = False i += 1 if 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 = True sqrtn = int(pow(i, .5)) for j in prime_list: if sqrtn >= j: if i%j ==0: flag = False break else: break if 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, False i = 2 n = 100 while i*i <= n: for j in range(2, n): if i*j <= n: ori_list[i*j] = False else: break while True: i += 1 if i*i <= n and ori_list[i] == False: continue else: break for i,num in enumerate(ori_list): if num == True: print i,
原文地址:http://blog.csdn.net/whiterbear/article/details/45462781