part 1:kownlege
首先,我们知道,素数筛是算法竞赛中及为基础且较好理解的部分。
亮图:
好,我们对素数筛有了一定的认识 ,就可以开始编程实现了。
part2:program
前面公用部分:
#include<bits/stdc++.h>
using namespace std;
int const N=(int)1e6+2;
bool f[N];//1:不是
线性筛:
//solve 2 (欧筛)(线性筛)(每个合数仅被自己的最小质因子筛掉)
int prime[N];
int main(){
int n,cnt=0;
cin>>n;
for(int i=2;i<=n;i++){
if(!f[i]){
cnt++;
prime[cnt]=i;
}
for(int j=1;i*prime[j]<=n;j++){
f[i*prime[j]]=1;
if(!(i%prime[j])){
break;
}
}
}
cout<<cnt;
return 0;
}
重点:if(!(i%prime[j])){
break;
}
当prime[j]不为i的因数时停止。
原因:若prime[j]是i的因数时,prime[j+1]必定也是i的因数,故停止。
欧筛:
//solve 1 (埃筛)
int main(){
int n,cnt=1;
cin>>n;
for(int i=2;i<=n;i++){
if(!f[i]){
for(int j=i+i;j<=n;j+=i){
if(!f[j]){
cnt++;
f[j]=1;
}
}
}
}
cout<<n-cnt;
return 0;
}
致谢:
谢谢阅读,欢迎指正!