运用Sieve of Eratosthenes算法,简单来说就是从2出发,除掉是2的倍数的数,然后从3出发,除掉3的倍数的数(3的2倍已经除掉,所以可以从3*3来除掉数),以此类推。已除掉的数就不在考虑,直到 sqrt(n) 。C语言代码如下:
int countPrimes(int n) {
if(n<=1)
return 0;//注意判断n的所有情况,代码robustness
int *table=malloc(sizeof(int)*n);
table[0]=1;
table[1]=1;
int i,j;
for(i=2;i<n;i++)
table[i]=0;
int total=n-2;
for(i=2;i*i<n;i++)
{
if(table[i]==0)
{
for(j=i*i;j<n;j=j+i)
if(table[j]==0)
{
table[j]=1;
total--;//sign
}
}
else
continue;
}
free(table);
return total;
}
在计数的时候,把它放在如代码的sign行,不要再在一个循环,这样可以节省时间。