简介
欧拉筛是在埃氏筛法的基础上优化了部分操作,使时间复杂度达到了O(n)。
实现代码
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "输入一个数字n,将输出2-n的所有素数" << endl;
cin >> n;
bool* a = new bool[n](); //表示是否为素数,0是素数,1是合数
int* b = new int[n](); //记录素数
int j = 0; //表示素数个数
for (int i = 2; i < n+1; i++) { //i表示一个数
if (a[i - 1] == 0) { //这里单独判断一下,是素数,就加进去。
b[j++] = i;
}
//这个循环是独立于上面的判断条件的。
//因此,对于每个i,其实,都去乘以了每个素数(满足乘积小于n+1的条件下)
//这里终于理解了!
for (int k = 0; k < j&&i*b[k]<n+1; k++) {
a[i * b[k]-1] = true;
if (i % b[k] == 0) break; //这里是欧拉筛优化的地方,只被第一个质因数算一下,后面的就直接略过。
//但是这里不会出现一个数,他本可以在这一次循环给判断为true了,实际却等到了以后,那又怎么保证一定可以不漏呢?
//数学可以!比如说是30,i等于6时,不行,i等于10时,不行,i等于15时,才可以。
}
}
for (int i = 0; i < j; i++) {
cout << b[i] << " ";
}
delete[]a;
delete[]b;
return 0;
}
主要的地方都做了详细的注释。
谢谢阅读!