埃拉托色尼筛算法

     还记得当时学习数据结构时老师留过一道作业题:编写程序打印出小于命令行参数所给定的整数的所有素数。当时我就是简单的利用穷举法实现的,呵呵,就是一个一个地进行判断。后来作业交了上去,也就不了了之了。老师并没有进行讲解,今天突然看到了应用数组解决这一问题的埃拉托色尼筛算法,恩!感觉很优美,省去了穷举法的大量的除法运算,下面我们就来看看其中的奥秘。
     首先我再明确一下素数的概念:一个正整数如果不等于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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值