线性筛
Start.
线性筛它是用来筛选出1-n之内的素数,它的时间复杂接近于O(n)。
它的大致过程是:使用一个长度为 n 的bool数组,刚开始都是未被标记的,从2开始找,将所有合数标记为true(筛选掉合数),没有被标记的就是素数。
而筛选合数的核心思想就是:所有合数都将被它的最小质因子筛掉。
细节:有一个知识点,对于所有的合数,它的最小质因子是唯一的,所以每个合数都有唯一的这样的形式:
合数=最小质因子* i(最小质因子的 i 倍 = 这个合数)
所以对于2-n中的每一个数 i , 都使用 i 与 i 之前的素数 相乘 得到应该被筛选掉的合数。
typedef long long ll;
const int N=10002;
bool vis[N]; //标记数组,true表示是合数,false是素数
int ans[N]; //存储得到的素数
int tot;
void getPirme(int n){
for(int i=2;i<=n;i++){
if(!vis[i]){ //没有被标记的为素数
ans[tot++]=i;
}
for(int j=0;j<tot&&(ll)ans[j]*i<=n;j++){ //用当前数i,与i之前的素数相乘取得一个合数
vis[ans[j]*i]=true

线性筛是一种高效筛选1-n内素数的方法,时间复杂度接近O(n)。通过标记合数,筛选过程中每个合数由其最小质因子唯一确定。线性筛还可用于判定素数、计算欧拉函数值和莫比乌斯函数值,以及求解数的因子个数等。
最低0.47元/天 解锁文章
3384

被折叠的 条评论
为什么被折叠?



