Count the number of prime numbers less than a non-negative number, n.
计算小于n的素数的个数。
素数,从2开始,2,3,5,7,11……
素数定义,除了被1和自身整除外,没有其他因数。
最直接的想法就是从2开始到n的平方根,如果有能整除的,就不是素数。
最直接的往往效率最低。
果然,虽然不断剪枝,但是本身的效率低下,再怎么努力也总是超时。
查看了discuss,果然是自己的思路不对,没有找到更高效的算法。
大神的思路是,从2开始到平方根的范围,如果一个数i是素数,那么它的倍数k*i就不是素数,而且,是从i*i开始的。果然厉害!
最后跟着大神的思路总算解决了。
https://leetcode.com/discuss/42097/short-c-sieve-of-eratosthenes-solution
大神代码:
class Solution {
public:
int countPrimes(int n) {
vector<bool> prime(n, true);
prime[0] = false, prime[1] = false;
for (int i = 0; i < sqrt(n); ++i) {
if (prime[i]) {
for (int j = i*i; j < n; j += i) {
prime[j] = false;
}
}
}
return count(prime.begin(), prime.end(), true);
}
};