题目1:给出一个正整数n,打印出所有从1~n的素数(即质数);
题目2:给出一个正整数n,打印出自然数中最小的n个素数(即质数);
先讨论问题1.
普通解法
- 傻瓜法
对于每个数m,逐个去除以小于它的数,看是否只有1能够整除。
- 优化
对于每个数m,逐个去除以小于等于sqrt(m)的数,看是否只有1能够整除。
- 进一步优化
对于每个数m,其实只需要对小于m的已经求出来的质数进行试除,直到sqrt(m)即可。因为如果不能被质数整除,一定也不能被合数整除。
筛法
首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。
-
朴素筛法(埃氏筛法&