埃拉托色尼筛选法

来源:互联网 发布:unity3d瀑布 编辑:程序博客网 时间:2024/06/07 00:14

埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。
用于求一定范围内的质数.
步骤:
(1)先把1删除(现今数学界1既不是质数也不是合数)
(2)读取队列中当前最小的数2,然后把2的倍数删去
(3)读取队列中当前最小的数3,然后把3的倍数删去
(4)读取队列中当前最小的数5,然后把5的倍数删去
(5)如上所述直到需求的范围内所有的数均删除或读取

对于每个素数k,算法将primes[k*i]设置为false。
在for循环中执行了n/k-k+1次
因此,时间复杂度

T(n)=n/2-2+1+n/3-3+1+n/5-5+1.....    =O(n/2+n/3+n/5+.....)    <O(nπ(n))    =O(n*根号n/logn)

ps:π(n)表示小于或等于n的素数的个数;
这里的上限时间复杂度是非常松散的,实际的时间复杂度比它好很多。

Java实现:

import java.util.Scanner;public class SieveOfEratosthenes{    public static void main(String[] args){        Scanner input=new Scanner(System.in);        System.out.print("Find all prime numbers <= n, enter n: ");        int n=input.nextInt();        boolean[] primes=new boolean[n+1];        for(int i=0;i<primes.length;i++){            primes[i]=true;        }        /**        *k=2 i=2...n/2;        *k=3 i=3...n/3;        *...        *保证k*i<=n        **/        for(int k=2;k<=n/k;k++){            if(primes[k]){                for(int i=k;i<=n/k;i++){                    primes[k*i]=false;                }            }        }        int count=0;        for(int i=2;i<primes.length;i++){            if(primes[i]){                count++;                if(count%10==0)                    System.out.printf("%7d\n",i);                else                    System.out.printf("%7d",i);            }        }        System.out.println("\n"+count+" primes less than or equal to "+n);    }}
原创粉丝点击