暴力:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; i++) {
bool flag = true;
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) cout << i << ' ';
}
return 0;
}
时间复杂度:O()
埃氏筛:用质数把质数的倍数筛掉
#include <bits/stdc++.h>
using namespace std;
bool prime[1000005];
int main() {
int n;
cin >> n;
memset(prime, 1, sizeof prime);
for (int i = 2; i <= n; i++) {
if (prime[i]) {
for (int j = 2 * i; j <= n; j += i) {
prime[j] = 0;
}
cout << i << ' ';
}
}
return 0;
}
时间复杂度:O()
欧拉筛:每个合数只需要被其最小的质因子筛掉
#include <bits/stdc++.h>
using namespace std;
bool not_prime[1000005];
int prime[1000005], tot = 0;
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; i++) {
if (!not_prime[i]) prime[++tot] = i;
for (int j = 1; j <= tot && i * prime[j] <= n; j++) {
not_prime[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
for (int i = 1; i <= tot; i++) {
cout << prime[i] << ' ';
}
return 0;
}
时间复杂度:O()