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[n];
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。

186

被折叠的 条评论
为什么被折叠?



