求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,
- 求100以内的质数
- 求100以内的质数
- 求100以内的质数
- 求100以内的所有质数
- C#求100以内的质数
- 求一百以内的质数
- PHP实现的求100以内的质数
- 一个求100以内质数的简单算法
- 求100以内的所有质数可以有多复杂?
- 2012/5/12---求100以内的质数
- 【Java】求1到100以内的素数(质数)
- C#代码:求100以内的质数(素数)
- C++求N以内所有的质数
- 求10000以内所有质数的和
- Java求n以内的所有质数
- 求N个数以内的质数
- 求N以内所有质数的和
- java 求多少以内的质数
- 数据库第四次作业 王小芬 2013212954 理学院
- 安卓学习第十九天:CheckBox与RadioButton
- zookeeper C API
- nyoj_289_苹果
- Android应用性能优化之使用SparseArray替代HashMap
- 求100以内的质数
- matlab求全相应
- RPM 使用
- 使用Java添加系统右键菜单--详解版
- poj2251 Dungeon Master
- Android蓝牙应用程序开发的基本步骤
- 扑克牌顺子
- KMP【模板】
- Java开发中的23种设计模式详解(转)