在计算素数的过程中,有两种经典的筛法:埃拉托色尼筛法(简称埃筛)和线性筛法(简称线筛)。它们都是用于在给定的范围内找到所有素数的高效算法。本文将通过示例代码,详细对比这两种方法的原理、实现及其时间复杂度。
1. 埃拉托色尼筛法
原理概述
埃拉托色尼筛法的基本思想是通过不断标记合数来筛选出素数。具体来说,对于每一个素数 p,从 p*p 开始标记所有的倍数为非素数,因为更小的倍数已经在之前被标记过。
代码实现
以下是埃筛法的 C++ 实现:
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> isPrime(n + 1, 1); // 初始化所有数为素数
isPrime[0] = isPrime[1] = 0; // 0 和 1 不是素数
for (int i = 2; i * i <= n; i++) { // 从 2 开始到 sqrt(n)
if (isPrime[i]) { // 如果 i 是素数
for (int j = i * i; j <= n; j += i) { // 标记 i 的所有倍数为非素数
isPrime[j] = 0;
}
}
}
// 输出所有素数
for (int