Java 面向对象实现埃氏筛法
Java 面向对象实现埃氏筛法
点击查看代码
public class SievePrime {
private int maxNum;
private boolean[] isPrime;
public SievePrime(int maxNum) {
this.maxNum = maxNum;
initArray();
sieve();
}
private void initArray() {
isPrime = new boolean[maxNum + 1];
for (int i = 2; i <= maxNum; i++) {
isPrime[i] = true;
}
}
private void sieve() {
for (int i = 2; i * i <= maxNum; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= maxNum; j += i) {
isPrime[j] = false;
}
}
}
}
public void printPrime() {
System.out.println("2到" + maxNum + "之间的质数:");
for (int i = 2; i <= maxNum; i++) {
if (isPrime[i]) {
System.out.print(i + " ");
}
}
}
public boolean isNumberPrime(int num) {
if(num < 2 || num > maxNum) return false;
return isPrime[num];
}
}
测试主类
点击查看代码
public class TestSieve {
public static void main(String[] args) {
SievePrime sieve = new SievePrime(100);
sieve.printPrime();
System.out.println("\n");
int test = 47;
System.out.println(test + "是否为质数:" + sieve.isNumberPrime(test));
}
}
实验说明
本程序采用面向对象思想封装埃氏筛法,将最大值、质数标记数组作为类私有成员,通过构造方法完成数组初始化与筛法运算,拆分初始化、筛除、打印、判断等独立方法实现高内聚。算法核心逻辑为:先默认所有数字为质数,从 2 开始将每个质数的倍数标记为非质数,最终未标记数字即为质数。对象实例化后可批量输出区间质数,也可单独判断指定数字,代码复用性强;相比暴力遍历求质数,时间复杂度优化至 O (n log log n),大数范围筛选效率更高。
浙公网安备 33010602011771号