题目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也是质数......上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。
-
朴素筛法(埃氏筛法)
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。