import java.util.Arrays;
public class CountPrimes {
public static void main(String[] args) {
CountPrimes test = new CountPrimes();
int count = test.countPrimes(10);
System.out.println(count);
}
//统计所有小于非负整数 n 的质数的数量。
//思路1:直接求--》时间复杂度太大
public int countPrimes(int n) {
int count = 0;
int j;
for (int i = 2; i < n; i ++) {
for (j = 2; j <= i - 1; j ++) {
if (i % j == 0) {
break;
}
}
if (j == i) {
count ++;
}
}
return count;
}
//思路2:根据思路1改进:
//首先,确认一个数 n 是否是素数,只需要判断 2 - sqrt(n)根号n, 因为根号n后面的就是前面的两个因子交换位置而已,一次不需要再往后判断了
//第二,如果一个数p 是素数,那么2 * p, 3 * p, 4 * p,.......都不可能是素数了,因此也需要跳过这些判断
public int countPrime(int n) {
boolean [] isPrime = new boolean[n];
Arrays.fill(isPrime,true);//初始化默认所有的数都是素数
for (int i = 2; i * i < n; i ++) {//只需要判断 2 - sqrt(n)根号n, 因为根号n后面的就是前面的两个因子交换位置而已,一次不需要再往后判断了
if (isPrime[i]) {
for(int j = i * i; j < n; j += i) {//j = i * i, j += i, 避免重复前面已经判断过的
isPrime[j] = false;//如果一个数p 是素数,那么2 * p, 3 * p, 4 * p,.......都不可能是素数了,因此也需要跳过这些判断
}
}
}
//经过以上操作,所有真正的素数已经拿到
int count = 0;
for (int i = 2; i < n; i ++) {
if (isPrime[i]) {
count ++;
}
}
return count;
}
}
计数质数的思路和JAVA代码实现之
最新推荐文章于 2022-09-01 20:34:01 发布