埃拉托斯特尼筛法
枚举i:从2开始到sqrt(n),将i的倍数去除剩下的就是n之内的素数了
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int map[10001],n;
int main(){
map[0] = 1;
map[1] = 1;
cin>>n;
for (int i=2;i<=sqrt(n+1);i++) {
for (int j=i*2;j<=n;j+=i) {
map[j] = 1;
}
}
for (int i=0;i<=n;i++) {
if(map[i] == 0) cout<<i<<" ";
}
return 0;
}
试想一下,合数77它既被11去除过,又被7去除过,显然是一种浪费,于是,
欧拉筛法
每个合数只被他的最小质因子去除一次,代码如下:
#include<iostream>
using namespace std;
int prime[1000],p[1000],n,tot;
int main() {
prime[0] = 1;
prime[1] = 1;
cin>>n;
for (int i=2;i<=n;i++) {
if (prime[i] == 0) p[++tot] = i;
for (int j=1;j<=tot && i*p[j]<=n;j++) {
prime[i*p[j]] = 1;
if (i%p[j] == 0) break;
}
}
for (int i=0;i<=n;i++) {
if (prime[i]==0)cout<<i<<" ";
}
return 0;
}