CDays–5 习题三(求质数)及相关内容解析。

今天让我们完成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."

image

程序挺简单的,我想如果有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,

image

但是我们的数学知识告诉我们,并不需要这么多循环,除数到开根就可以了。

我们进一步优化程序。

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

运行出错,不过没有关系,让我们看一下输出。

第四行的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。

image

啄木鸟论坛给出了更简便的解法。如下

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
只是把多行合并为一行了。趁此机会,我们在下篇日志中将讲解 int( ) 以及 列表方法
posted @ 2013-02-07 22:11  传说中的福利君  阅读(644)  评论(0编辑  收藏  举报