题目:
Description:
Count the number of prime numbers less than a non-negative number, n.
题意:
找出小于n的所有素数。
思路:
采用筛选法。首先知道如果一个数不是素数,那么它一定可以表示成多个素数相乘,而且很明显这些素数肯定是比这个合数小。
每次第一个没删去的元素就是素数,接下来找该素数的所有倍数(倍数大于等于2进行删除)。那么为什么说每次第一个没有删除的数就是素数呢。比如当前第一个没删除的数是m,那么m之前的素数都已经删过对应的倍数,很明显m不是那些小的素数的倍数,所以m是一个素数。
代码如下:
class Solution {
public:
int countPrimes(int n) {
n--;
if(n <= 1)return 0;
vector<int> nums(n + 1,1);
for(int i = 2; i <= sqrt(n); i++)
{
if(nums[i] == 0)continue;
int j = i + i;
while(j <= n)
{
nums[j] = 0;
j += i;
}
}
int count = 0;
for(int i = 2; i < n + 1; i++)
count += nums[i];
return count;
}
};