在编程学习中,求素数(质数)是一个经典问题。对于初学者来说,最直观的方法是逐个判断每个数字是否为素数,但当数据量变大时,这种方法效率极低。今天,我们将介绍一种高效的算法——埃拉托斯特尼筛法(Sieve of Eratosthenes),并用Java语言筛法求素数进行详细讲解,即使你是编程小白,也能轻松掌握!
埃拉托斯特尼筛法是一种古老而高效的算法,用于找出小于或等于某个给定整数 n 的所有素数。它的基本思想是:从2开始,将每个素数的倍数标记为合数(非素数),剩下的未被标记的数就是素数。
相比传统的逐个判断法(时间复杂度约为 O(n√n)),埃拉托斯特尼筛法的时间复杂度仅为 O(n log log n),在处理大范围数据时优势明显。这也是为什么Java高效求素数常采用此方法。
下面我们一步步用 Java 实现筛法求素数:
isPrime[0..n],初始化为 true。isPrime[0] 和 isPrime[1] 设为 false(因为0和1不是素数)。isPrime[i] == true),则将其所有倍数(从 i² 开始)标记为 false。true 的索引即为素数。以下是一个完整的、可直接运行的 Java 程序,展示了如何使用筛法找出 1 到 100 之间的所有素数:
public class SieveOfEratosthenes { public static void findPrimes(int n) { // 创建布尔数组,初始值全为true boolean[] isPrime = new boolean[n + 1]; for (int i = 0; i <= n; i++) { isPrime[i] = true; } // 0和1不是素数 isPrime[0] = false; isPrime[1] = false; // 从2开始筛选 for (int i = 2; i * i <= n; i++) { if (isPrime[i]) { // 将i的所有倍数标记为非素数 for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } } // 输出所有素数 System.out.println("小于等于 " + n + " 的素数有:"); for (int i = 2; i <= n; i++) { if (isPrime[i]) { System.out.print(i + " "); } } System.out.println(); } public static void main(String[] args) { findPrimes(100); }}
在上述代码中:
boolean[] isPrime 数组来记录每个数字是否为素数。i * i 开始,因为小于 i * i 的倍数(如 2i, 3i...)已经被之前的素数筛掉了。这个算法逻辑清晰、结构简单,非常适合Java初学者素数算法的学习。通过理解筛法,你不仅能掌握一种高效算法,还能提升对数组和循环控制的理解。
今天我们详细讲解了如何用 Java 实现埃拉托斯特尼筛法来高效求解素数。无论你是准备面试,还是学习算法基础,掌握Java筛法求素数都是非常有价值的技能。希望这篇教程能帮助你轻松入门!
提示:你可以尝试修改代码中的 n 值,观察不同范围内的素数结果,加深理解。
本文由主机测评网于2025-12-16发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128608.html