您的位置:首页 > 其它

[leetcode 204] Count Primes

2015-12-12 17:15 417 查看
Question:

Description:

Count the number of prime numbers less than a non-negative number, n.

分析:

求解比n小的所有素数的个数;

暴力法:

判断比n小的数是否为素数。

采用埃拉托斯特尼筛法Sieve
of Eratosthenes方法,具体解析参考网上各路大神的解析:

2是最小的质数,那么2的倍数均不为质数(因为它们可以分解为一个数*2),所以我们可以将小于n的数中2的倍数,全部标记为FALSE;

标记掉2的整数倍后,剩下的数中大于2的最小的数就是下一个质数,也就是3.

同样我们可以标记掉小于n的数中3的整数倍的数,得到下一个质数为5.

根据上述思路处理,直到获得所有的质数为止。

从2开始直到n的开方即可。

代码如下:

<span style="font-size:14px;">class Solution {
private:
bool ifPrimes(int n){
if(n == 1)
return false;
if(n == 2)
return true;
if(n % 2 == 0)
return false;
else{
int q = (int)sqrt(n);
for(int i = 3; i * i <= n; i += 2){
if(n % i == 0)
return false;
}
return true;
}
}
public:
int countPrimes(int n) {
/*int cnt = 0;
if(n <= 2)
return 0;
else{
++cnt;
}
for(int i  = 3; i < n; i += 2){
bool ifp = false;
ifp = ifPrimes(i);

if(ifp)
++cnt;
}
return cnt;*/
if (n <= 2)
return 0;
bool *p = new bool
;
memset(p, true, sizeof(bool) * n);
for (int i = 2; i * i < n; i++)
{
if (p[i])
{
for (int j = 2; j * i < n; j++)
p[i * j] = false;
}
}

int cnt = 0;
for (int i = 2; i != n; i++)
if (p[i])   cnt++;
delete[] p;
return cnt;
}
};</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: