文章列表

埃氏筛

Champ2024.11.24 00:00访问量0 次阅读
求质数

传统求质数的方法:暴力枚举(o(n√n)) (btw '√'是option+v)

埃氏筛求质数:(o(nloglogn))

#include <iostream>
using namespace std;
class Solution{
public:
    int CountPrime(int n){
        vector<int>isPrime(n,1);
        int count=0;
        for(int i=2;i<n;i++)
        {
            if(isPrime[i])
            {
                count++;
                if(long long i*i<n)
                {
                    for(int j=i*i;j<n;j+=i)
                        isPrime[j]=0;//质数的倍数肯定不是质数了
                }
            }
        }return count;
    }
}

对于一个质数 x,如果按上文说的我们从 2x 开始标记其实是冗余的,应该直接从 x⋅x 开始标记,因为 2x,3x,… 这些数一定在 x 之前就被其他数的倍数标记过了,例如 2 的所有倍数,3 的所有倍数等。

历史留言 (0)
ICP备案号浙ICP备2026065730号-1公安备案号浙公网安备33019202003213号