您的位置:首页 > 其它

Leetcode 204 Count Primes

2015-06-06 20:06 435 查看
Description:

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

求小于n的素数的数量。

最传统的做法就是做一个判定函数,从2开始到n判断,看有多少素数。判定素数的方法就是从2到根号n,看看是不是可以被n整除。但是看了提示后,发现还有别的便捷的方法来解,就是原始的Sieve of Eratosthenes方法,http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes,维基百科有具体介绍,(据说是Eratosthenes保留下来的仅有的一项成果,记录在Introduction to Arithmetic这本书上)这种方法可以直接找到小于n的所有素数,具体的做法是从2到根号n进行搜索,如果没有标记为非素数的话,那么就把他的所有倍数全部标记为非素数,这样最后剩下来的未标记的就都是素数了,但是稍有改进,首先,对于标记为非素数的数,不再对他的倍数进行标记操作,因为之前肯定已经标记过了,此外,对于某个数,可以从他的平方开始进行标记,因为之前的肯定都被标记过了,比如说5开始,那么2*5,3*5,4*5肯定都检测并标记过了,所以直接从5*5开始就可以了。

具体代码如下:

class Solution {

public:

int countPrimes(int n) {

bool *mapPrimeMark = new bool
;

for(int i = 2; i < n; i++)

{

mapPrimeMark[i] = true;

}

for(int i = 2; i * i < n; i++)

{

if(!mapPrimeMark[i])

continue;

for(int j = i * i; j < n; j += i)

{

mapPrimeMark[j] = false;

}

}

int ret = 0;

for(int i = 2; i < n; i++)

{

if(mapPrimeMark[i])

ret++;

}

delete[] mapPrimeMark;

return ret;

}

};

代码有个地方需要注意,数组比map要快,用map的话会直接tle。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: