题目
Description:
Count the number of prime numbers less than a non-negative number, n
分析和思路
题目分为两个部分:
1)素数的判断;
2)找出所有小于n的素数。
素数的判断比较容易,而n以内素数的筛选用到了
Sieve of Eratosthenes
OK,代码如下:
class Solution {
public:
bool isPrimeNumber(unsigned long n)
{
if (n <= 3) {
return n > 1;
} else if (n % 2 == 0 || n % 3 == 0) {
return false;
} else {
for (unsigned short i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
}
int countPrimes(int n) {
//Sieve of Eratosthenes http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
if(n>2)
{
bool* a = new bool[n];
for(int i=2;i<n;i++)
a[i]=true;
int sqrt_n = int(sqrt(n))+1;
for(int i=2;i<sqrt_n;i++)
{
if(a[i] == false)
continue;
else if(isPrimeNumber(i))
{
a[i]=true;
for(int j=i*i;j<n;j+=i)
{
a[j]=false;
}
}
}
int cnt=0;
for(int i=2;i<n;i++)
if(a[i] == true)
cnt++;
return cnt;
}
return 0;
}
};