筛质数

筛质数

题目

[868. 筛质数 - AcWing题库]

方法

线性筛法 O(n)

思路

要求每一次要找到以primes[i]为最小公约数的合数。

当有i%primes[j]==0时,说明i的最小质因子是primes[j],因此primes[j]*i的最小质因子也就应该是prime[j],之后接着用st[primes[j+1]i]=true去筛合数时,就不是用最小质因子去更新了,因为i有最小质因子primes[j]<primes[j+1],此时的primes[j+1]不是primes[j+1]i的最小质因子,此时就应该退出循环,避免之后重复进行筛选。

代码

void get_primes(int n){
    for (int i = 2; i <= n; i ++ ){
        if(!st[i]) primes[ans++]=i;
        for (int j =0 ; primes[j]*i <= n; j ++ ){
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}
posted @ 2022-03-23 19:38  初#  阅读(23)  评论(0)    收藏  举报