#57
埃氏筛
Champ2024.11.24 00:00created at 2024.11.24 00:00updated at 2024.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 的所有倍数等。