📜  埃拉托色尼筛法的Java程序(1)

📅  最后修改于: 2023-12-03 15:23:39.265000             🧑  作者: Mango

埃拉托色尼筛法的Java程序

埃拉托色尼筛法是一种求素数的算法,可以快速找到一定范围内的素数。它的基本思想是从2开始,不断筛掉素数的倍数,剩下的即为素数。

下面是使用Java实现的埃拉托色尼筛法程序:

import java.util.*;

public class EratosthenesSieve {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要获取素数的范围:");
        int n = scanner.nextInt();
        List<Integer> primes = getPrimes(n);
        System.out.println("范围内的素数为:");
        for (int prime : primes) {
            System.out.print(prime + " ");
        }
    }

    public static List<Integer> getPrimes(int n) {
        boolean[] isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        for (int i = 2; i * i <= n; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= n; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        List<Integer> primes = new ArrayList<>();
        for (int i = 2; i <= n; i++) {
            if (isPrime[i]) {
                primes.add(i);
            }
        }
        return primes;
    }
}

代码解析:

1.首先导入java.util包,因为需要用到List和Scanner类。

2.在主函数中,读入要获取素数的范围,并调用getPrimes函数获取素数。

3.getPrimes函数中,首先创建一个布尔类型的数组isPrime,用来标记每个数是否是素数。因为数组下标从0开始,所以要创建n+1个元素。

4.使用Arrays.fill函数将isPrime数组中所有元素赋值为true,表示初始时所有数都是素数。

5.从2开始遍历数组,如果当前数是素数,则将其所有的倍数都标记为非素数。注意,只需要遍历到n的平方根即可,因为更大的数已经被倍数标记过了。

6.遍历数组,将所有标记为素数的数加入到List中,并返回该List。

7.在主函数中输出素数列表。

总结

通过埃拉托色尼筛法,我们可以快速找到一定范围内的素数。该算法的时间复杂度为O(nloglogn),比较高效。在实际应用中,可以选择其他更优秀的算法来处理大规模的素数计算问题。