这道题还是挺有意思的,找质数,如果按照最笨的方法一个一个遍历,需要的复杂度是O(N*N),但是显然复杂度比较高,所以,需要找到时间复杂度比较低的方案。
题目大意 :给出一个数,找出所有小于该数的质数,并输出质数的个数是多少。
首先,我们找到第一个质数2, 然后将2的整数倍且比n小的元素都置为0,这样4,6,8,……都置为0,然后继续寻找第二个质数,找到了3,将3的整数倍且比n小的元素都置为0,依次类推,直到找到根号n时停止,因为,举个例子,16可以由2*8 4*4 8*2组成,而2*8 和8*2是等价的,因此只需要找出另一半就可以了。
将所有的合数都置为了0,那么从2开始数没有置为的0的数字个数,最终输出的结果就是所有质数的个数。
代码如下:
class Solution {
public:
int countPrimes(int n) {
vector<bool> isprime(n, 1);
for (int i=2; i*i < n; ++i) {
if (isprime[i]) {
for (int j=i*i; j<n; j+=i) {
isprime[j] = 0;
}
}
}
int count = 0;
for (int i=2; i<n; ++i) {
if (isprime[i]) {
++count;
}
}
return count;
}
};