Count the number of prime numbers less than a non-negative number, n.
Example:
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
给出一个非负整数n,问<n的质数有多少个
思路:
最简单粗暴的方法:
从2到n-1逐个判断是否是质数
判断质数的方法:
依次判断能否被2~sqrt(n)整除。
总体时间复杂度O(n1.5)
筛子法:
空间换时间,声明长度为n的boolean数组
因为非质数一定可以分解成两个数的乘积
i从2开始,到sqrt(n)
每到一个数i,让它直到n范围内的所有倍数都设为false(非质数)
证明可以从i * i开始,而不需要从i * 2开始
因此把2i, 3i, …, sqrt(n)简化到
i * i : sqrt(n) : i 设为false
最后统计true的个数
//10ms
public int countPrimes(int n) {
if (n < 3) {
return 0;
}
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
int end = (int)Math.sqrt(n);
int count = 0;
for (int i = 2; i <= end; i ++) {
if (!isPrime[i]) {
continue;
}
for (int j = i*i; j < n; j += i) {
isPrime[j] = false;
}
}
for (int i = 0; i < n; i++) {
if (isPrime[i]) count ++;
}
}