求小于n的所有素数
普通筛法
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<map>
#define FAST ios::_sync_with_stdio(false)
typedef long long ll;
const int maxn = (int)1e6 + 5;
using namespace std;
int prime[maxn];
vector<int> arr;
int main()
{
//init
FAST;
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
//input
int n;
cin >> n;
//solve
for(int i = 2; i <= n; i++){
if(prime[i]) arr.push_back(i);
else continue;
for(int j = 1; i * j <= n; j++){
prime[i*j] = false;
}
}
//output
for(int i = 0; i < arr.size(); i++){
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
优化:明显可以知道标记false有重复的操作,比如6在2,3被标了两次(而且越大会越多),所以对于数i,我们只标记小于等于素数i的素数与i的乘积,(即对于i *j,j< i && prime[j] = true)。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<map>
#define FAST ios::sync_with_stdio(false)
typedef long long ll;
const int maxn = (int)1e6 + 5;
using namespace std;
int prime[maxn];
vector<int> arr;
int main()
{
//init
FAST;
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
//input
int n;
cin >> n;
//solve
for(int i = 2; i <= n; i++){
if(prime[i]) arr.push_back(i);
for(int j = 0; j < arr.size(); j++){
prime[i*arr[j]] = false;
}
}
//output
for(int i = 0; i < arr.size(); i++){
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
over