计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

(1).首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
(2).取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
(3).取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
(4).取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
不断筛下去,就可以得到所有的素数。

用Python实现(迭代器):

!/usr/bin/env python3

-- coding: utf-8 --

def main():

for n in primes():
    if n < 1000:
        print(n)
    else:
        break

def _odd_iter():

n = 1
while True:
    n = n + 2
    yield n

def _not_divisible(n):

return lambda x: x % n > 0

def primes():

yield 2
it = _odd_iter()
while True:
    n = next(it)
    yield n
    it = filter(_not_divisible(n), it)

if name == '__main__':

main()

类似的,可以使用C语言实现(百度):

include <stdio.h>

define TRUE 1

define FALSE 0

define SIZE 10000

int main()
{
int i; /i表示整数和对应的下标/
int j; /j表示正要处理的质数j之前的已处理j之后的未处理/
int k; /k表示正在处理的j的倍数从2开始到jk<SIZE*/
int a[SIZE]; /下标表示整数内容判断是否为质数/
int p; /控制循环*/
for(p = a; p < a+SIZE; ++p) { /初始化数组全是TRUE/

*p = TRUE;
}

a[0] = a[1] = FALSE; /设置前面两个不是质数的数的状态为FALSE/
i = 2;
while(i < SIZE) { /找到下一个质数/

while(a[i++] == TRUE) {
  j = i-1;
break;
}

for(k = 2; jk < SIZE && i < SIZE; ++k) { /处理质数的倍数*/
a[j*k] = FALSE;
}
}
for(p = a; p < a+SIZE; ++p) { /打印出质数/
if(*p == TRUE) {
printf("%8d", p-a);
}
}
printf("\n");
return 0;
}
其他语言亦可以轻松实现.

最后修改:2025 年 04 月 26 日
如果觉得我的文章对你有用,请随意赞赏