试除法
就是从2开始一个一个试,只要都无法除尽即为素数。需要注意的是只要试到 即可。
#include <iostream>
using namespace std;
bool is_prime(int x) {
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ ) {
if (x % i == 0) return false;
}
return true;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) {
int a;
scanf("%d", &a);
printf("%s\n", is_prime(a) ? "Yes" : "No");
}
return 0;
}埃拉托斯特尼筛法(Sieve of Eratosthenes)
埃拉托斯特尼筛法(Sieve of Eratosthenes) 是一种高效找出一定范围内所有素数的算法。
原理简单:
- 先假设所有数都是素数
- 从 2 开始,把它的倍数都标记为“合数”
- 找到下一个没被标记的数(下一个素数),再把它的倍数标记
- 重复直到 。
#include <iostream>
#include <vector>
using namespace std;
void sieve(int n, vector<bool>& primes) {
primes[0] = primes[1] = false;
for (int i = 2; i * i <= n; i ++ ) {
if (primes[i]) {
for (int j = i * i; j <= n; j += i) {
primes[j] = false;
}
}
}
}
int main() {
int n;
scanf("%d", &n);
vector<bool> p(n + 1, true);
sieve(n, p);
int ans = 0;
for (int i = 2; i <= n; i ++ ) {
if (p[i]) ans ++;
}
printf("%d\n", ans);
return 0;
}