统计所有小于非负整数 n
的质数的数量。
示例1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例2:
输入:n = 0
输出:0
示例3:
输入:n = 1
输出:0
整体思路:
埃氏筛。挺好理解的筛选方法,x为质数那么x的倍数肯定都是合数,将质数用1标记出啦,统计1的个数即可
代码题解:
class Solution {
public:
int countPrimes(int n) {
vector<int>isprime(n,1);
int ans=0;
for(int i=2;i<n;i++)
{
if(isprime[i])
{
ans+=1;
if((long long)i*i<n)
{
for(int j=i*i;j<n;j+=i)//
{
isprime[j]=0;
}
}
}
}
return ans;
}
};
对于一个质数 x,从 2x开始标记其实是冗余的,应该直接从x*x开始标记,因为 2x,3x,…这些数一定在 xx之前就被其他数的倍数标记过了,例如 2的所有倍数,3的所有倍数等。(官方的话)