-
埃式筛法:
-
基本思路:通过筛选的方式找出一定范围内的所有质数。从小到大遍历所有的数,如果当前数是质数,则将它的倍数标记为合数。
-
算法步骤:
- 将给定的范围上限max作为输入。
- 初始化一个长度为max+1的布尔数组isPrime,将所有元素初始化为true。
- 将isPrime[0]和isPrime[1]设为false,表示0和1不是质数。
- 从2开始,遍历到max的平方根(sqrt(max)),对于每个质数p,将其倍数pp, p(p+1), p*(p+2), ...标记为合数(将对应位置的isPrime设置为false)。
- 遍历isPrime数组,将所有为true的下标值即为质数。
-
-
线性筛法:
-
基本思路:线性筛法是对埃式筛法的改进,通过遍历一次的方式找出一定范围内的所有质数。在埃式筛法中,每个合数都会被标记多次,而线性筛法通过一个质数只筛除一次的方式,使得每个合数只会被最小的质因子筛除。
-
算法步骤:
- 将给定的范围上限max作为输入。
- 初始化一个长度为max+1的整数数组primes,用于存储质数。
- 初始化一个长度为max+1的布尔数组isPrime,将所有元素初始化为true。
- 将isPrime[0]和isPrime[1]设为false,表示0和1不是质数。
- 遍历2到max的每个数i,如果isPrime[i]为true,将i添加到primes数组中。
- 遍历primes数组,对于每个质数p,将p与当前遍历的数i相乘,如果超过max则跳出循环;否则,将isPrime[p*i]设为false。
- 返回primes数组中的所有质数
-