Description:
Count the number of prime numbers less than a non-negative number, n.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
题目描述:求小于正整数n的所有素数个数。
注意:1不是素数也不是合数,其他正整数要么是素数,要么是合数,通常用两个for循环依次除小于该数的每个数字的方法判断效率太低,AC不了。不如换个思路:求小于n的所有合数,若某一个数字的平方小于n,那么这个数是符合条件的合数,而平方再加上若干个该数,也是合数。
public static int countPrimes(int n) {
int res = 0;
boolean[] used = new boolean[n];
for (int i = 2; i <= Math.sqrt(n); i++) {
if (!used[i]) {
int temp = i * i;
while (temp < n) {
used[temp] = true;
temp += i;
}
}
}
for (int i = 2; i < n; i++) {
if (!used[i]) {
res++;
}
}
return res;
}
效率刚刚地。