求质数

Prime Number, 中文名质数,素数。它的定义是:在大于1的自然数中,除了被1和它本身整除外,无法被其它自然数整除的数。

如果这个自然数能被3个或者3个以上的自然数整除,那么这个数被称为合数。

(1和0是数论中的特殊存在,既不是质数也不是合数。)

Prime 的其中一个中文解释为基本的,所以质数也是自然数中的基础,任何合数都可以表示为若干个质数相乘的结果。

(在数学界非常有名的哥德巴赫猜想就是围绕质数来说的)。

 

在计算机算法中,求某个数以内的所有质数的一般方法是:

  1. 求这个数的平方根
  2. 从2开始,到平方根结束,如果有一个数能被该数整除,即可排除它是质数的可能
  3. 如果一直到平方根结束,没有找到任何数能整除它,说明它是质数

 

以求100内所有质数为例,大致算法代码如下:

虽然现在计算机的速度已经很快了,但是有没有更快捷的方式呢?

古希腊有一个数学家叫 Eratosthenes(厄拉多塞),他在寻找质数的时候另辟新径: 他将2 –N 的各个数放入表中,把2先标记出来,然后将2的倍数全部擦去。

第一个没有被擦的数字是3,他给3 做了一个标记,然后将3的倍数全部擦去。

接下来没有被擦去的数字是5,他又给5做了一个标记,然后将5的倍数全部擦去。

………………

一直到所有小于等于N的数都擦去或者做了标记,这个过程结束,这时留下的数字就是N以内的所有质数。

 

这个方法类似用一个筛子把不满足条件的数筛掉,也由于这个方法最初是Eratosthenes (厄拉多塞)发明的,我们称这种方法为 “厄拉多塞筛

还是以100以内的质数为例,大致代码:

第二种算法其实是用空间来换取时间,需要引入新的变量。不过现在计算机内存已经基本够用了,这个代价其实是能负担的。如果希望空间小,那么可以酌情选择额外空间的类型(如:char short 数组等)

另外,这个算法可以精简到只遍历到平方根,找到平方根内所有数的倍数即可。这里只是提出了另外一种解题的思路。

posted @ 2017-05-16 13:48  DanielHu83  阅读(261)  评论(0编辑  收藏  举报