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