Java之用厄拉多塞筛选法求n以内的所有素数

本文介绍了如何使用Java编程实现厄拉多塞筛法,详细讲解了算法思路,并给出了具体的代码实现,通过该方法可以找出指定范围内的所有素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Scanner;
public class eladuosai
{
    public static void main(String []args)
    /**首先将2~n放入一个筛集,将已知的最小的素数2放入素数集,
     *再去掉筛集中所有2的倍数,筛集中最小值3即为新找到的素数,
     *再去掉3的所有倍数,筛集中最小值即为新找到的素数。
     *依次执行上去,直到筛集为空,素数集中的数就是我们要找的素数。
     **/
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个整数n");
        int n = sc.nextInt();
        int a[] =new int[n-2];
        for(int i=0;i<n-2;i++)
           a[i]=i+2;
        for(int i=1;i<n-2;i++)
        {
            for(int j=0;j<i;j++)
            if(a[j]!=0)
            if(a[i]%a[j]==0)
            a[i]=0;
        }
        for(int i=0;i<n-2;i++)
        if(a[i]!=0)
        System.out.println(a[i]+" ");               
    }
}

运行结果如下:
这里写图片描述

### 方法概述 生成所有小于等于 \( n \) 的素数可以通过多种方法实现,其中最常见的是 **拉多筛法** 和改进版的 **欧拉筛(线性筛)**。以下是两种主要算法的具体描述及其代码示例。 --- #### 拉多筛法 此方法基于这样一个事实:任何合数都可以表示为至少一个小于它的质数的倍数。因此,我们只需要从小到大依次筛选掉每个已知质数的所有倍数即可[^4]。 ```python def eratosthenes_sieve(n): is_prime = [True] * (n + 1) p = 2 while p * p <= n: if is_prime[p]: for multiple in range(p * p, n + 1, p): is_prime[multiple] = False p += 1 primes = [] for num in range(2, n + 1): if is_prime[num]: primes.append(num) return primes ``` 上述代码中,`is_prime` 数组用于记录某个数字是否仍被认为是质数。初始状态下假设所有数字都是质数 (`True`),随后逐步将其非质数的倍数标记为 `False`。 --- #### 欧拉筛(线性筛) 相比拉多筛法,欧拉筛进一步减少了冗余操作,确保每个合数仅被其最小质因数标记一次。这使得时间复杂度降低至 \( O(n) \)[^1]。 核心逻辑在于维护两个列表: - `primes`: 存储当前找到的所有质数; - `is_composite`: 记录某数值是否已被确认为合数。 每当遇到一个新的质数时,它会立即加入 `primes` 列表,并利用现有质数逐一尝试构建新的合数并加以标记。特别注意,在内层循环过程中一旦检测到 \( i \% p == 0 \),即应终止继续扩展更大的复合数,因为此时再增加只会引入重复项。 ```python def euler_sieve(n): primes = [] is_composite = [False] * (n + 1) for i in range(2, n + 1): if not is_composite[i]: primes.append(i) for p in primes: if i * p > n: break is_composite[i * p] = True if i % p == 0: break return primes ``` 在此版本里,通过提前退出不必要的迭代以及精准控制哪些位置需更新状态来提升效率。 --- ### 总结对比 | 特性 | 拉多筛法 | 欧拉筛 | |--------------------|----------------------------------|-----------------------------| | 时间复杂度 | \(O(n\log{\log{n}})\) | \(O(n)\) | | 是否存在重复标记 | 是 | 否 | 尽管两者都能有效解决问题,但在实际应用中尤其是面对较大范围的数据集时,推荐优先考虑采用更高效的欧拉筛方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值