📅  最后修改于: 2023-12-03 15:23:39.265000             🧑  作者: Mango
埃拉托色尼筛法是一种求素数的算法,可以快速找到一定范围内的素数。它的基本思想是从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),比较高效。在实际应用中,可以选择其他更优秀的算法来处理大规模的素数计算问题。