统计n以前的素数的个数....按照传统的思路,我们会遍历n以前的所有数,一个个判断是否是素数....这样的时间代价是O(n*n)的。
一种简单的做法是标记出n之前所有质因子的倍数,剩余未标记的自然就是素数了。利用temp[n]来记录,各位初始都是false,i从2开始代表因子,标记其小于n的倍数;i递增时,当temp[i]是false未标记时,说明i是一个质数(i不是任意小于其的数的倍数);否则i及i的倍数已被标记过,可以直接continue到下一个i。这样,我们相当于在O(n)的时间内标记出了所有数,效率较高
public class Solution {
public int countPrimes(int n) {
boolean[] temp = new boolean[n];
for(int i=2;i*i<n;i++)
{
if(temp[i] == false)
{
for(int j=i;j*i<n;j++)
{
temp[j*i] = true;
}
}
}
int count=0;
for( int i=2;i<n;i++)
{
if(temp[i]==false)
{
count++;
}
}
return count;
}
}