素数问题汇总
知识总结
素数判定
对于 n > 1,检查 2 到 √n 是否有因子:
1bool isPrime(int n) {
2 if (n < 2) return false;
3 for (int i = 2; i * i <= n; i++)
4 if (n % i == 0) return false;
5 return true;
6}时间复杂度:O(√n)
埃拉托斯特尼筛法(埃氏筛)
筛出 1~n 中所有素数:
1bool notPrime[N];
2void sieve(int n) {
3 notPrime[0] = notPrime[1] = true;
4 for (int i = 2; i * i <= n; i++)
5 if (!notPrime[i])
6 for (int j = i * i; j <= n; j += i)
7 notPrime[j] = true;
8}时间复杂度:O(n log log n)
线性筛(欧拉筛)
每个合数只被最小质因子筛掉一次:
1int primes[N], cnt = 0;
2bool notPrime[N];
3void linearSieve(int n) {
4 for (int i = 2; i <= n; i++) {
5 if (!notPrime[i]) primes[cnt++] = i;
6 for (int j = 0; j < cnt && i * primes[j] <= n; j++) {
7 notPrime[i * primes[j]] = true;
8 if (i % primes[j] == 0) break;
9 }
10 }
11}时间复杂度:O(n)
常考知识点
- 100以内有 25 个素数
- 1000以内有 168 个素数
- 2是唯一的偶数素数
- 1既不是素数也不是合数
- 素数的分布:n以内约有 n/ln(n) 个素数