统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
class Solution {
public:
int countPrimes(int n) {
if(n <= 2) return 0;
if(n == 3) return 1;
vector<int> vecTmp = {2};
int numRes = 1;
bool bPrimeFlag = true;
for(int i = 3; i < n; i++)
{
bPrimeFlag = true;
for(auto it = vecTmp.begin(); it != vecTmp.end(); it++)
{
if(i % *it == 0)
{
bPrimeFlag = false;
break;
}
}
if(bPrimeFlag)
{
vecTmp.push_back(i);
numRes++;
}
}
return numRes;
}
};
方法一:采用vector存储所有的质数,遍历所有数与vector中的质数相除,从而确定该数是否为质数,该方法会超时,不推荐。
class Solution {
public:
int countPrimes(int n) {
vector<bool> bFlag(n, false);
int numRes = 0;
for(int i = 2; i < n; i++)
{
if(!bFlag[i])
{
numRes++;
for(int j = 2; j * i < n; j++)
{
bFlag[i*j] = true;
}
}
}
return numRes;
}
};
方法二:厄拉多塞筛法. 比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推(后续更新此方法的优化版)