埃拉托斯特尼筛法(埃氏筛)详解

你还在为暴力解素数而烦恼吗,看过来~

在这里插入图片描述

什么是素数

这个其实早就应该知道啦,重复一下好了~~
素数也称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
最基本的质数:
2, 3, 5, 7, 11, 13, 17, 19, ……

什么是埃氏筛

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。
要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。

埃氏筛怎么算

给出要筛数值的范围n,找出以内的素数。
先用2去筛,即把2留下,把2的倍数剔除掉;
再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;
接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;
不断重复下去…
最终,把所有不大于根号n的所有素数的倍数剔除,剩下的就是素数。

归纳一下基本思想

  • 如果n是质数,那么2n, 3n, 4n, …这些n的倍数肯定都不是质数。
  • 如果选的数要多,那么要选的每个数要尽可能小。

时间复杂度

O(nloglogn)

Java实现代码

/**
 * 埃拉托斯特尼筛法(埃氏筛)——sieve of Eratosthenes
 * @author Eratosthenes
 */
public class Eratosthenes {
    public static void main(String[] args) {
        int num = 101;
        boolean[] array = new boolean[num];
        int k = 2, temp = 0;
        while(temp < num) {
            //将不是素数的数逐一筛出
            for(int i = 2; i < num; i++) {
                if(i % k == 0 && i != k) {
                    array[i] = true;
                }
            }
            //将筛选后的第一个数当做新的筛子
            for(int i = 2; i < num; i++) {
                if(i > k && !array[i]) {
                    k=i;
                    break;
                }
            }
            temp++;
        }
        for(int i = 2; i < num; i++) {
            if(!array[i]) {
                System.out.print(i + " ");
            }
        }
    }
}

用途

很简单啦,求素数呗~~
比起我们暴力求素数,这种方法实在是好很多啦!!
比如洛谷的P5723题
后面会给出题解的啦~~


题解来啦

发布了351 篇原创文章 · 获赞 610 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104045480