可使用经典的划圈法:从2开始,将小于N且是2倍数的数都逐一排除
该题有几个加速的地方:1.flag标记使用bool,而非int型(在后续的编程过程中,涉及flag标记的问题尽可能使用bool(0/1)型,而非int(0/1)型)
2. i<=sqrt(n);
3.if(flag[i]==0)
4.i*j<=n
class Solution {
public:
int countPrimes(int n) {
bool flag[n+1]={0};
for(int i=2;i<=sqrt(n);i++)
{
if(flag[i]==0)
{
for(int j=i;i*j<=n;j++)
{
flag[i*j]=1;
}
}
}
int res=0;
for(int i=2;i<n;i++)
if(!flag[i])
res++;
return res;
}
};