LeetCode:计算素数
统计所有小于非负整数
n
的质数的数量埃拉托斯特尼筛法(埃氏筛):要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数
public static Integer getPrimeNumberCounts(int n){
Integer counts = 0;
// 初始化数组全为false
boolean[] booleans = new boolean[n];
// 从2开始,将所有数的X倍标记为合数(因为是X倍,所以必然存在因数:x、本身、1)
for(int i=2;i * i< n;i++){
// I的倍数从本身开始即可,因为比他小的倍数会在之前算过,如2*3 3*2 要直接从3*3开始
int x = i;
// I的X倍需要小于n,因为超过N时就不在该数组范围内,计数超额
while (i * x < n){
// 因为是X倍,所以必然存在因数:X和本身、1
// 将合数标记为true
booleans[i*x] = true;
x++;
}
}
// 注意数组从2开始计算
for(int y = 2; y<n;y++){
if(!booleans[y]){
counts++;
}
}
return counts;
}