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),大数范围筛选效率更高。

posted @ 2026-06-18 15:30  pigeon1237  阅读(2)  评论(0)    收藏  举报