统计所有小于非负整数 n 的质数的数量。
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
厄拉多塞筛法
在寻找素数时,先将2~N的各个数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;
下一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;
现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,
一直到所有小于或等于N的各数都画了圈或划去为止。
表中画了圈的以及未划去的那些数正好就是小于N的素数。
代码:
int countPrimes(int n) {
if(n<=2)return 0;
int sz[n+1],number=0;
for(int i=2;i<n;i++)
sz[i]=1;
for(int x=2;x<n;x++)
{
if(sz[x]!=0)
{
int i=2,sum=x*i;
while(sum<n)
{
if(sz[sum]!=0&&sum!=x)sz[sum]=0;
sum=x*(++i);
}
}
if(sz[x]!=0)number++;
}
return number;
}