最近在复习算法,求素数是一个很常用的算法。不禁引发了我的一些思考。
想到大一的时候用暴力枚举法求素数了,埃式筛选法求素数是一个比较好的算法。
在网上看了一下,没有把这个算法讲的比较清晰的博客,于是我打算自己梳理一下。
比如要求从1到n范围内的素数表,基本算法思想就是从第一个质数2开始,把2的所有倍数标记为非素数,然后进入到3,把3的所有倍数标记为非素数,然后跳过4(因为4是2的倍数而且已经被标记为非素数了),然后进入到5,把5的所有倍数标记为非素数,循环直至结束。
以上算法还可以继续改进,那就是最外层循环可以只遍历到根号n就行了。因为大于根号n的数要么是素数,要么就有一个小于根号n的因数(而这是不可能发生的,因为如果它有小于根号n的因数的话,那他就已经被筛掉了)。
代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int * a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i;
}
for (int i = 2; i < sqrt(double(n)); i++) {
for (int j = i + 1; j < n; j++) {
if (a[j] != 0 && a[j] % i == 0)
a[j] = 0;
}
}
for (int i = 2; i &