--- title: "筛素数" created: 2025-11-28 tags: - 算法 --- # 筛素数 ## 题目 [筛质数](https://www.acwing.com/solution/content/7950/) ![[image-ab1c8045.png]] ## 思路分析 如果要找一段区间里 质数的个数 首先最容易想到的办法就是 对每个数判断一下是不是素数 是的话 cnt++ 还是那句话 填空题用 编程题别想 tle ```cpp #include 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;cin>>n; int cnt=0; for(int i=2;i<=n;i++) if(is_prime(i)) cnt++; cout< using namespace std; const int N=1000010; int primes[N]; bool st[N]; int cnt=0; int n; void get_primes(){ for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i;//把素数存起来 for(int j=i;j<=n;j+=i){//不管是合数还是质数,都用来筛掉后面它的倍数 st[j]=true; } } } int main(){ cin>>n; get_primes(); cout< using namespace std; const int N=1000010; int primes[N]; bool st[N]; int cnt=0; int n; void get_primes(){ for(int i=2;i<=n;i++){ if(!st[i]){ //可以用质数就把所有的合数都筛掉; primes[cnt++]=i; for(int j=i;j<=n;j+=i) st[j]=true; } } } int main(){ cin>>n; get_primes(); cout< using namespace std; const int N=1000010; int primes[N]; bool st[N]; int cnt=0; int n; void get_primes(){ for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i; for(int j=0;primes[j]<=n/i;j++){ st[primes[j]*i]=true; if(i%primes[j]==0) break; } } } int main(){ cin>>n; get_primes(); cout<