Prime Number, 中文名质数,素数。它的定义是:在大于1的自然数中,除了被1和它本身整除外,无法被其它自然数整除的数。
如果这个自然数能被3个或者3个以上的自然数整除,那么这个数被称为合数。
(1和0是数论中的特殊存在,既不是质数也不是合数。)
Prime 的其中一个中文解释为基本的,所以质数也是自然数中的基础,任何合数都可以表示为若干个质数相乘的结果。
(在数学界非常有名的哥德巴赫猜想就是围绕质数来说的)。
在计算机算法中,求某个数以内的所有质数的一般方法是:
- 求这个数的平方根
- 从2开始,到平方根结束,如果有一个数能被该数整除,即可排除它是质数的可能
- 如果一直到平方根结束,没有找到任何数能整除它,说明它是质数
以求100内所有质数为例,大致算法代码如下:
虽然现在计算机的速度已经很快了,但是有没有更快捷的方式呢?
古希腊有一个数学家叫 Eratosthenes(厄拉多塞),他在寻找质数的时候另辟新径: 他将2 –N 的各个数放入表中,把2先标记出来,然后将2的倍数全部擦去。
第一个没有被擦的数字是3,他给3 做了一个标记,然后将3的倍数全部擦去。
接下来没有被擦去的数字是5,他又给5做了一个标记,然后将5的倍数全部擦去。
………………
一直到所有小于等于N的数都擦去或者做了标记,这个过程结束,这时留下的数字就是N以内的所有质数。
这个方法类似用一个筛子把不满足条件的数筛掉,也由于这个方法最初是Eratosthenes (厄拉多塞)发明的,我们称这种方法为 “厄拉多塞筛法”
还是以100以内的质数为例,大致代码:
第二种算法其实是用空间来换取时间,需要引入新的变量。不过现在计算机内存已经基本够用了,这个代价其实是能负担的。如果希望空间小,那么可以酌情选择额外空间的类型(如:char short 数组等)
另外,这个算法可以精简到只遍历到平方根,找到平方根内所有数的倍数即可。这里只是提出了另外一种解题的思路。