艾拉托斯特你筛法(java实现)

原创 2016年06月02日 10:56:04

艾拉托斯特你筛法能够非常高效的生成素数序列,原理是剔除所有可能被素数整除的非素数。
给出要筛数值的范围n,找出n以内的素数p1,p2,,pk。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去……。
这里写图片描述
以下是java实现代码:

public class PrimeNumber {
    public static void main(String[] args) {
        int max = 100;
        PrimeNumber pn = new PrimeNumber();
        pn.sieveOfEratosthenes(max);

    }
    boolean[] sieveOfEratosthenes(int max){
        boolean[] flags = new boolean[max+1];
        int count = 0;//统计一共有多少个素数
        int prime = 2;
        //初始化,设置flags数组全部为true
        for (int i = 0; i < max; i++) {
            flags[i] = true;
        }
        flags[0] = flags[1] = false;

        while (prime <= max) {
            //剔除prime的倍数
            crossOff(flags, prime);
            //找出下一个为true的值
            prime = getNextPrime(flags, prime);
            if (prime >= flags.length) {
                break;
            }
            count++;
            System.out.println("prime = "+prime);
        }
        System.out.println("count = "+count);

        return flags;
    }
    void crossOff(boolean[] flags,int prime){
        /*
         * 剔除余下的prime倍数的数字,从prime*prime开始,因为如果k*prime且k<prime,
         * 在之前的迭代中已经被剔除了
         */
        for (int i = prime*prime; i < flags.length; i+=prime) {
            flags[i] =false;
        }
    }
    int getNextPrime(boolean[] flags,int prime){
        int next = prime + 1;
        while (next < flags.length && !flags[next]) {
            next++;
        }
        return next;
    }
}

以上代码还可以优化计算次数,即只把奇数放进数组,即可减半。

版权声明:本文为博主原创文章,未经博主允许不得转载。

质数筛选方法(埃拉托斯特尼筛法)

今天刷题刷了这么一道题, The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes...
  • jiang111_111shan
  • jiang111_111shan
  • 2015年07月10日 20:59
  • 2198

判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)

说明: 素数的定义:质数(prime number)又称素数。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。 最小的素数...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年06月04日 18:36
  • 2879

埃拉托斯特尼筛法 --- 希腊,筛选素数

埃拉托斯特尼筛法 --- 希腊,筛选素数
  • u012965373
  • u012965373
  • 2016年08月19日 10:11
  • 1115

Sieve of Eratosthenes(埃拉托斯特尼素数筛选法)--java实现

埃拉托色尼筛选法 埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选...
  • f2006116
  • f2006116
  • 2016年07月11日 14:58
  • 1079

(扩展)欧几里得算法、素性测试、埃式筛法、区间筛法、快速幂运算

来自挑战程序设计竞赛2.6 数学问题的解题窍门 1.素数测试 //素性测试O(√n) bool is_prime(int n) { for(int i=2;i*i...
  • qq_33929112
  • qq_33929112
  • 2016年08月15日 19:34
  • 500

找质数算法之埃拉托色尼筛选法(Sieve of Eratosthenes算法)

一、算法原理 一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。 二、步骤 (1)先把1删除(1既不是质数也不是合数) (2)...
  • xiaoquantouer
  • xiaoquantouer
  • 2016年07月03日 23:51
  • 2676

利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化

1.算法简介1.1筛法起源筛法是一种简单检定素数的算法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratosth...
  • K346K346
  • K346K346
  • 2015年05月09日 12:24
  • 2343

迪杰斯特拉算法Java实现

public class Dijkstra { static int MAX=10000; public static void main(String[] args) { ...
  • wangshuang1631
  • wangshuang1631
  • 2016年09月23日 13:45
  • 2720

线性筛与欧拉函数、莫比乌斯函数

网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用。最朴素的素数筛——埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlognint primes[M...
  • Joovo
  • Joovo
  • 2017年04月17日 01:52
  • 839

JAVA实现最短距离算法之迪杰斯特拉算法

最短路径问题是图论研究中的一个经典的算法问题,旨在寻找图中两个节点之间的最短路径,最常用的算法有Dijkstra算法、SPFA算法\Bellman-Ford算法、Floyd算法\Floyd-Warsh...
  • xiaojimanman
  • xiaojimanman
  • 2016年03月14日 22:13
  • 10459
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:艾拉托斯特你筛法(java实现)
举报原因:
原因补充:

(最多只允许输入30个字)