原题:Count the number of prime numbers less than a non-negative number, n.
求小于正整数n的质数的个数
通常我们的做法是从最小的质数2开始遍历直到n,判断其中每一个数是否为质数,当n很大的时候,肯定超时。
有更高效的解法如下:
质数只能被1和他自己整除,也就是说他不包含基本因子2,3,5,7等
我们可以排除上述这些数来大大提高遍历效率
2是最小的质数,所有是2的倍数的整数一定不是质数,这样排除掉一部分整数,然后是3,排除掉所有是3的倍数的整数,因为4已经在前面排除掉了,所以接下来是5,排除掉所有是5的倍数的整数,以此类推,直到n
如何知道一个数是否排除掉了,可以设一个布尔型数组,记录每个数的情况
Java实现:
public class Solution {
public int countPrimes(int n) {
if(n<=2) return 0;
boolean[] p = new boolean[n];
for (int i = 2; i < p.length; i++) {
p[i]=true;
}
for (int i = 2; i*i <n ; i++) {
if(p[i]){
for (int j = i+i; j < n; j+=i) {
p[j]=false;
}
}
}
int cunt=0;
for (int i = 2; i < n; i++) {
if(p[i]) cunt++;
}
return cunt;
}
}