码迷,mamicode.com
首页 > 其他好文 > 详细

求100以内的质数

时间:2015-05-03 23:46:14      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:求素数算法   求质数算法   质数   素数   

求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 = 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,


求100以内的质数

标签:求素数算法   求质数算法   质数   素数   

原文地址:http://blog.csdn.net/whiterbear/article/details/45462781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!