前言
普通的素数筛暴力的二重循环的算法时间复杂度是O(n^2),用sqrt的话可以优化一下,算法时间复杂度可以提升一下,但是有时候遇到1e7的还是无法满足,时间就会超时。
埃氏筛的算法时间复杂度是O(nloglogn)。
欧拉筛的算法时间复杂度是O(n)。
暴力筛法
用sqrt优化后的
埃氏筛
原理:首先将2到n范围内的整数记录下来。其中2是最小的素数,将表中所有2的倍数划去,表中剩下的最小数字就是3,它不能被更小的数整除了,所以3个素数,然后再将表中所有3的倍数都划去…..以此类推(如果表中剩余的最小数是m,那么m就是素数,然后将表中所有m的倍数都划去),反复操作,就能依次枚举n以内的素数。
例如:求1~20之内的素数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
第一趟:从2开始,将2的倍数划去,
2 3 5 7 9 11 13 15 17 19
第二趟:从3开始,将3的倍数划去
2 3 5 7 11 13 17 19
……..
后面的只要是素数的就不会进行操作,直接跳过,一开始时初始化默认全是素数。
欧拉筛
原理:在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的