筛素数:埃氏筛,线性筛(欧拉筛)

1.适用情况:给定我们一个值n,需要我们求出不大于n的所有素数。(素数是 >= 2的,0和1不是素数)

2.分析:我们知道一个合数(不小于2)是由若干个素数相乘得来的,那么我们就可以得到一些启发,如果我们现在有一个比较小的素数,比如2,那么我就可以枚举这素数的倍数(也就是一次循环),将这些数标记为非素数,这些数那就都是合数了(4,6,8,10…),这就是筛素数的核心原理。因为存在上限n,那么我们也就只需将不超过n的某一个素数的倍数全部枚举出来就可以了,这样可以除去该素数的所有合数。这个时候在考虑一下,假设我们现在已经对素数2枚举完成了,那么现在小于n的数中就不存在因子为2的合数了,也就是说我们剩下的数中未标记的数那就是当前未筛选出来的最小的那个素数了(这里的话就 3)。这么说可能不太好理解,我举个栗子。比如,n=20,第一次循环用第1个素数也就2进行枚举,那么4,6,8,10,12,14,16,18,20都标记为非素数,那么现在剩下未标记为非素数的数有3,5,7,9,11,13,15,17,19,可以看到现在最小的数是3,那么3就是第2个素数。接下来第二轮循环,用3进行枚举,那么筛完之后就只剩下了5, 7, 11, 13,17,19了,我们可以看到现在未标记为非素数的最小数为5,那么5就是第3个素数,然后不断继续前面的过程,就可以将所有的素数筛出来了。结合代码,更好理解。

埃氏筛

复杂度为O(n logn)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int prime[MAXN],pcnt=0;
bool is_prime[MAXN];
void getprime(int MAX){
   
	for(int i=1;i<=MAX;i++)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值