leetcode 204. Count Primes
题目描述
这是道纯数学类问题。
先回忆一下,素数的定义。
质数(英文名:Prime number)又称素数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
可以用简单好理解的Eratosthenes筛法,时间复杂度是O(nloglogn)。
算法从小到大枚举所有数,对每一个素数(从2开始,已知2是素数),筛去它的所有倍数,剩下的就都是素数了。当从小到大到达某数a时,如果a没有被前面步骤的数筛去,那么a一定是素数。这是因为,如果a不是素数,那么a一定有小于a的素因子,这样在之前的步骤中a一定会被筛掉,所以当枚举到a时还没有被筛掉,那么a一定是素数。
class Solution {
public:
int countPrimes(int n) {
//由素数的定义,1既不是素数也不是合数
if(n < 2) return 0;
int prime_count = 0;
//isPrime[i]表示,正整数i是否是素数,i>=2
vector<bool> isPrime(n,true);
for(int i = 2;i<n;i++){
if(isPrime[i]){
//使用Eratosthenes筛法,素数的倍数肯定不是素数
for(int j = i+i;j < n;j+=i){
isPrime[j] = false;
}
prime_count++;
}
}
return prime_count;
}
};