算法41 数素数
这两种筛法思路太巧妙了
埃氏筛EratosthenesEratosthenes
class Solution {
public:
int countPrimes(int n) {
int primes;
vector<int> isPrime(n, 1);
for (int i = 2; i < n; ++i) {
if (isPrime[i]==1) {
primes++;
for(long j=i;i*j<n;j++){//直接从i^2开始
isPrime[i*j]=0;
}
}
}
return primes;
}
};
线性筛
- 一个素数表
- 一个标记表
- 遍历标记表i
- 遍历素数表j
- 标记i*j
- 判断i%j0则返回上一层循环:**i/j=k;i(j.next)在i=k(j+1)时在jj标记**
class Solution {
public:
int countPrimes(int n) {
vector<int> primes;
vector<int> isPrime(n, 1);
for (int i = 2; i < n; ++i) {
if (isPrime[i]==1) {
primes.emplace_back(i);
}
for(auto p:primes){
if(i*p>=n)
break;
isPrime[i*p]=0;
if(i%p==0)
break;
}
}
return primes.size();
}
};
代码还可以优化