题目描述
统计所有小于非负整数 n 的质数的数量。
示例:
1 | 输入: 10 |
解决方案
方法一:暴力法
逐个判断 [ 2 , n )中的每个整数,是否为质数。
1 | class Solution { |
该方法的时间复杂度为$O(n\sqrt{n})$。
由于本题有几个较大的测试用例,如1500000,采用暴力法会超时。
方法二:埃氏筛法
埃拉托色尼筛选法(the Sieve of Eratosthenes),简称埃氏筛法,其主要思想:当某个数为素数时,那么这个数的倍数一定不是素数。
1 | class Solution { |
该方法的时间复杂度为$O(n\log{\log{n}})$。
方法三:欧式筛法
在埃氏筛选法中,每一个非素数(合数)可能会有多次判断,例如,12,被2 6判定为非素数,亦会被3 4判定为非素数。
为了去除这种重复的判断,只使用一个数的最小质因数(能整除给定正整数的最小的质数)来排除该数字,这就是欧式筛选法。
1 | class Solution { |
该方法的时间复杂度为$O(n)$。