素数的筛数法通常用在优化传统素数方法。其实就是对特定问题的一个小优化
通常用在求1~n中的素数。
- 首先我们来看一下通常怎么解决,也就是从1到n遍历,分别判断每一个数是否是素数。判断是否为素数,这里有一个优化就是我们只需要遍历到根号n。假如这个数是16,我们只需要在2~4里面找是否有它的因子,因为28和82是重复的我们不需要重复判断,如果根号n内没有它的因子,就是素数。
- 对一个素数的求解我们显然无法优化,而对于1到n的素数求解我们就可以优化了
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
//初始化一个向量有n+1个元素值都为1,表示初始默认都是素数
vector<int> prime(n+1,1);
for(int i=2;i*i<=n;i++){
//素数的倍数显然是合数
if(prime[i]==1)
//从2*i到3*i等等,直到这个数大于n
for(int j=2*i;j<n;j+=i){
prime[j]=0;
}
}
//从1开始遍历
for(int i=1;i<n;i++){
if(prime[i]==1) cout<<i<<endl;
}
return 0;
}
不懂评论区问我哟!