今天让我们完成CDays –5 的最后一项内容吧。
寻找质数似乎是一个数学问题。让我们用Python实现它吧。
首先,我们需要明确质数是什么,根据百度百科有如下表述:
数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一。基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等。算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的。这个定理的重要一点是,将1排斥在素数集合以外。如果1被认为是素数,那么这些严格的阐述就不得不加上一些限制条件。
如此看来,我们的循环只需要从2到100了。因为1被排除在质数之外了。
我们如何确定一个数是否为质数呢。我们的想法很简单,就是用2到这个数内所有的整数对它取余。先让我们实现这个小功能。
我们还不知道怎么输入呢,那就先定义一个数好了。
import math num=73 for i in range(2,num+1): if (math.fmod(num,i) == 0.0) : break if (i==num): print "The num is Prime Number." else: print "The num isn't Prime Number."
程序挺简单的,我想如果有C语言基础的话,这应该是挺容易看懂的。
需要强调的是下面的定义
range(x,y)
这个的意思是产生 x 到 y-1 的整数序列.
那么让我们用这个小程序循环起来,判断1-100 中的质数,并输出.
import math ins=0 for num in range(1,101): for ins in range(2,num+1): if (math.fmod(num,ins) == 0.0): break if (ins == num ): print '%d' % num,
但是我们的数学知识告诉我们,并不需要这么多循环,除数到开根就可以了。
我们进一步优化程序。
import math ins=0 for num in range(0,101): for ins in range(2,math.sqrt(num)+1): if (math.fmod(num,ins) == 0.0): break if (ins == num ): print '%d' % num,
![image image](https://i-blog.csdnimg.cn/blog_migrate/d40eaed1eb232bb055016e9cc8a1ac0f.png)
运行出错,不过没有关系,让我们看一下输出。
第四行的range的两个数都应该是整数,恩,这个好办,int( ) 就是用来做这个的。
import math ins=0 for num in range(2,101): flag=1; for ins in range(2,int(math.sqrt(num))+1): if (math.fmod(num,ins) == 0.0): flag=0; break if (flag == 1): print '%d' % num,
在这里面flag是标志位,用来表示是否有数可以整除num。
啄木鸟论坛给出了更简便的解法。如下
result2 = [ p for p in range(2, N) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ] print result2