可使用经典的划圈法:从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;
}
};
本文介绍了一种高效的素数计数算法,采用经典划圈法,并通过四个关键步骤进行优化,包括使用bool类型标记、限制遍历范围到根号n、检查标记状态及更新合数标记。文中提供了一个具体的C++实现示例。
899

被折叠的 条评论
为什么被折叠?



