- 分享一波素数筛法;O(n^2),在一堆数中,在外循环中从2开始循环到n,在内循环中除去i的倍数,遍历后剩下的就是素数;
public int countPrimes(int n) {
boolean[] arr = new boolean[n];
for(int i=2;i<arr.length;i++) {
arr[i] = true;
}
for(int i = 2; i*i<arr.length;i++) {
if(arr[i]) {
for(int j=i*i;j<arr.length;j+=i) {
if(arr[j]) {
arr[j]=false;
}
}
}}
int sum = 0;
for(boolean x:arr) {
sum+=x?1:0;
}
return sum;
}
不过实在太慢了,于是我借鉴了另一个大佬的解法
public int countPrimes(int n) {
if(n < 3){
return 0;
}
boolean[] f = new boolean[n];
int count = n / 2;
for(int i = 3; i * i < n; i += 2){
if(f[i])
continue;
for(int j = i * i; j < n; j += 2 * i){
if(!f[j]){
--count;
f[j] = true;
}
}
}
return count;
}
不懂,先码着,以后再看