题目:统计N以内的素数
素数:只能被1和自身整除的数,0、1除外
解法2:埃氏筛
利用合数的概念(非素数),素数 * N必然是合数,因此可以从2开始遍历,将所有的合数做上标记。
将合数标记为true,j = i * i 从 2 * i 优化而来,系数2会随着遍历递增(j += i,相当于递增了系数2),
每一个合数都会有两个比本身要小的因子(0,1除外),2 * i 必然会遍历到这两个因子
当2递增到大于根号n时,其实后面的已经无需再判断(或者只需判断后面一段),而2到根号n、实际
上在 i 递增的过程中已经计算过了,i 实际上就相当于根号n
例如:n = 25 会计算以下
2 * 4 = 8
3 * 4 = 12
但实际上8和12已经标记过,在n = 17时已经计算了 3 * 4,2 * 4
package od;
/**
* 埃氏筛选法统计素数个数
* 利用合数的概念(非素数),素数*n必然是合数,因此可以从2开始遍历,将所有的合数做上标记
* 原文地址:https://www.codernav.com/2786.html
*/
public class Odtest07 {
public static void main(String[] args) {
int count = eratosthenes(100);
System.out.println(count);
}
public static int eratosthenes(int n) {
boolean[] isPrime = new boolean[n];//false代表素数
int ans = 0;
for (int i = 2; i < n; i++) {
if (!isPrime[i]) {
ans += 1;
for (int j = i * i; j < n; j += i) {//j就是合数的标记位
isPrime[j] = true;
}
}
}
return ans;
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
