简介
欧拉线性筛筛法可以在O(n)的复杂度内求一个范围内的素数
原理参考文章:欧拉筛(线性筛)& 欧拉函数
实现
/**
* 欧拉线性筛法求素数
*
* @桀骜 2018/8/21
*/
#include <iostream>
#include <cstring>
using namespace std;
#define PRIMES_MAX 10000
class EulerPrime {
private:
bool flag[PRIMES_MAX];
public:
int primes[PRIMES_MAX]; //存放素数的数组
int getPrimes(int n) { //返回值是该范围内素数个数
int cnt = 0;
memset(flag, false, sizeof(flag));
for (int i = 2; i < n; i++) {
if (!flag[i]) {
primes[cnt++] = i;
}
for (int j = 0; j < cnt; j++) {
if (i * primes[j] > n) {
break;
}
flag[i * primes[j]] = true;
if (i % primes[j] == 0) {
break;
}
}
}
return cnt;
}
};
int main() {
EulerPrime p;
int n = p.getPrimes(1000);
for (int i = 0; i < n; i++) {
cout << p.primes[i] << " ";
}
return 0;
}