`
aladdin_leon
  • 浏览: 118535 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

埃拉托色尼筛算法

阅读更多

     还记得当时学习数据结构时老师留过一道作业题:编写程序打印出小于命令行参数所给定的整数的所有素数。当时我就是简单的利用穷举法实现的,呵呵,就是一个一个地进行判断。后来作业交了上去,也就不了了之了。老师并没有进行讲解,今天突然看到了应用数组解决这一问题的埃拉托色尼筛算法,恩!感觉很优美,省去了穷举法的大量的除法运算,下面我们就来看看其中的奥秘。
     首先我再明确一下素数的概念:一个正整数如果不等于1而且除了自己和1没有其他正因数,则称其为一个素数(也称质数);否则称其为合数。1既不是素数也不是合数。
     埃拉托色尼筛算法的思想是:申请一个布尔数组a,如果i是素数,就把a[i]置为true,否则,就把a[i]置为false。首先,把所有数组元素都置为true,表明所有数都是素数。然后再把对应于下标为非素数(是已知素数的倍数,因为2是我们知道的最小的素数,所以以2作为跌代的起点)的数组元素设为false。如果在所有较小素数的倍数都被设为false值后,a[i]的值仍然是true,那么它肯定是一个素数。用JAVA实现的代码如下:

  1. public class Primes {   
  2.       public static void main(String[] args) {   
  3.             int N = Integer.parseInt(args[0]);   
  4.             boolean[] a = new boolean[N];   
  5.             for(int i = 2; i < N; i++) {   
  6.                   a[i] = true;   
  7.              }   
  8.              for(int i = 2; i < N; i++) {   
  9.                   if(a[i] != false) {   
  10.                       for(int j = i; j*i < N; j++) {   
  11.                            a[i*j] = false;   
  12.                       }   
  13.                  }   
  14.              }   
  15.             for(int i = 2; i < N; i++) {   
  16.                  if(a[i]) {   
  17.                      System.out.println("" + i);   
  18.                  }   
  19.             }   
  20.       }   
  21. }  
分享到:
评论
1 楼 jpkuser 2010-05-20  
楼主给的代码可改进:
一. 外层循环的终止条件不必为i < N,此条件作了无用功,且如果N过大,如2000000会报java.lang.IndexOutOfBoundsException异常;
      因此,外层循环的终止条件应改为i*i < N
二. 用boolean数组不如用BitSet高效 
   因此,语句boolean[] a = new boolean[N];
       可改为BitSet b=new BitSet(N);
      相应的a[i] = true;
         a[i*j] = false
       分别改为b.set(i);
             b.clear(i*j);

完整代码如下:
               BitSet bs=new BitSet(n+1);
int i;
for(i=2;i<=n;i++)
  bs.set(i);
for(i = 2; i*i < n; i++) {   
                  if(bs.get(i)) {
                for(int j = i; j*i <= n; j++)    
                          bs.clear(i*j);
                       }
                   } 

相关推荐

    (素数)埃拉托色尼筛

    可以批量求出 大范围内的 素数。这个算法有点复杂。想要最好的可以去我的资料中 找另外一个。反正都是免费的~

    MyPrime:埃拉托色尼筛

    点击按钮后,应用会调用埃氏筛算法,找到指定范围内的所有素数,并将结果显示在TextView或者ListView等组件上。 以下是可能的Java代码实现: ```java public class MainActivity extends AppCompatActivity { ...

    埃拉托色尼示例代码

    埃拉托色尼素数筛选法,也称为埃拉托斯特尼筛法,是一种古老而有效的算法,用于找出一个给定范围内的所有素数。该方法由古希腊数学家埃拉托色尼提出,通过一系列的排除过程,可以有效地找到所有小于给定数的素数。...

    soe:埃拉托色尼筛法的实现

    您可能用来完成该作业的算法称为试算,而且速度很慢。 在确定小于足够大整数的所有素数时,即使是计算机也需要一段时间才能使用此算法。 但是一位希腊数学家从不同的角度看待这个问题。 这个 Maven 项目使用一个 ...

    Eratosthenes:用于AIDE github访问测试。既然是样品,我会尽量用“埃拉托色尼筛”做

    一种应用“Eratosthenes 筛法”来查找和显示由开始和结束指定的整数之间的素数的算法。 在显示的末尾,添加找到了多少个素数(计数)以及找到它们所需的时间(时间)。 这是一个我刚刚玩过的应用程序,试图在 ...

    素数筛选法的改进及C语言实现.pdf

    埃拉托色尼筛法(Sieve of Eratosthenes)是一种古老且高效的算法,用于找出小于或等于给定数N的所有素数。该方法首先将1到N的整数列表中的所有数字视为可能的素数,然后从2开始,对于每一个已知的素数,将其所有的...

    算法课设--求素数问题

    求素数问题。埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法。从建立一个整数2~N的表着手,寻找i˂的整数,编程实现此算法,并讨论运算时间。

    erathostenes:埃拉托色尼的筛子-matlab开发

    该程序的灵感来自艺术品: Sieb des Eratosthenes(Eratosthenes 的筛子)(1971 年)来自 Rune Mields(德国画家,1935 年生) 这幅来自她的 9 幅面板艺术作品的作品将素数显示为白点。 左栏显示89栏排列的数字,...

    ACM算法类型大纲 思维导图全

    3. 素数检测:暴力法、筛法(埃拉托色尼筛、欧拉筛、线性筛)、Miller-Rabin测试。 4. 分解质因数:找出一个数的所有质因数。 5. 欧拉函数:φ(n)表示小于等于n且与n互质的正整数的数量。 6. 欧拉定理和快速幂:快速...

    12.zip_图形图像处理_C/C++_

    然而,描述中提到的却是“埃拉托色尼筛法(Sieve of Eratosthenes)”,这是计算数学中的一个算法,用于找出给定范围内所有的素数,与图形图像处理并无直接关联。这可能是压缩包内容的一个误解或者错误分类,因为两...

    数据结构与算法任务书总论.docx

    2. **埃拉托色尼筛法**:这是求解素数的经典算法,主要考察循环和条件判断的运用,以及对算法复杂度的理解。需要理解如何从2开始遍历到N,标记合数,最终得到所有小于N的素数。 3. **方程求解问题**:这涉及到搜索...

    数据结构与算法课设题目一1.docx

    2. 埃拉托色尼筛法:这是寻找素数的经典算法,通过遍历从2到N的整数,标记掉每个素数的所有倍数,最后未被标记的数字即为素数。时间复杂度为O(N log log N)。 3. 方程求解问题:可以使用回溯法或穷举法,限制变量在...

    java笔试题算法-sieve:用各种语言实现Eratosthenes筛以展示GraalVM和Truffle的强大功能

    java笔试题算法多种语言的埃拉托色尼筛子 以各种语言实现 Eratosthenes 筛以展示 GraalVM 和 Truffle 的强大功能。 请先下载后再进行实验。 已经过测试可以与版本19.3.1 。 Ruby速度 使用以下命令可以发现 GraalVM ...

    数据结构与算法任务书总论.pdf

    2. **埃拉托色尼筛法**:这是求解素数的经典算法,通过遍历从2到N的数,将倍数剔除,留下素数。关注点在于如何优化循环和减少计算量以提高效率。 3. **方程求解**:这是一个数学问题,需要编程找出特定条件下的整数...

    数据结构与算法课设题目一 (2).pdf

    2. **素数问题**:埃拉托色尼筛法是一种用于找出所有小于给定数的素数的高效算法。基本思想是从2开始,标记其倍数为非素数,直到所有小于给定数的素数都被找出。 3. **方程求解问题**:这可能需要使用穷举搜索或...

    SieveOfEratosthenes:一个 android 应用程序,用户可以输入一个大于 1 的数字并找到 2 和该数字之间的所有质数

    埃拉托色尼筛法是一种古老的算法,用于寻找一定范围内所有的质数。这个算法的基本思想是通过逐步排除合数(非质数)来找出质数。具体步骤如下: 1. 创建一个包含从2到目标数的所有整数的列表。 2. 从2开始,标记2的...

    数据结构与算法课设题目一1 (2).docx

    2. 求素数问题:埃拉托色尼筛法是一种高效的求素数算法。从2开始,将所有倍数剔除,直到达到目标值N,留下的数就是素数。时间复杂度为O(N log log N)。 3. 方程求解问题:这是一道回溯法或动态规划问题,需要在整数...

    数据结构与算法课设题目一 (2).docx

    2. **求素数问题**:埃拉托色尼筛法是一种用于找出一定范围内所有素数的算法。它通过逐步排除非素数来实现,从最小的质数2开始,删除它的倍数,接着处理下一个未删除的数,直到处理完所有数。 3. **方程求解问题**...

Global site tag (gtag.js) - Google Analytics