求素数是经常碰到的问题了,显然我们要使用高效的线性算法—-筛选法。但是这个过程中要注意的一点是再乘积的过程中溢出。(题目给的数字较大的情况下)
public int countPrimes(int n){
int result=0;
if(n<=0){
return result;
}
boolean[] book=new boolean [n+1];
for(int i=2;i<n+1;i++){
//假如是素数就把这个素数用来乘积
if(book[i]==false){
result++;
for(int j=2;j*i<n;j++){
book[j*i]=true;
}
}
}
return result;
}
1不是质数
错误的代码
public int countPrimes(int n) {
int result = 0;
if (n <= 0) {
return result;
}
long[] nums = new long[n + 1];
for (int i = 2; i < nums.length; i++) {
//这里的乘法会溢出
for (int j = i * i; j < nums.length; j += i) {
nums[j] = 1;
}
}
int counter = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != 1) {
counter++;
} else {
System.out.println(i);
}
}
return counter;
}