统计所有小于非负整数 n
的质数的数量。
示例 1:
输入:n = 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0 输出:0
示例 3:
输入:n = 1 输出:0
提示:
0 <= n <= 5 *
解法
质数相关问题有个套路方法叫
埃氏筛:如果 x 是质数,那么大于 x 的倍数 2x,3x...一定不是质数。
所以我们可以根据这个思路,搞一个数组,记录每个质数,并把后续的非质数排除掉
代码
func countPrimes(n int) int {
if n <= 1 {
return 0
}
var cnt int
flag := make([]bool, n)
for i := 2; i < n; i++ {
if flag[i] {
continue
}
cnt++
// 这里把2i, 3i。。。标记为非质数
for j := i*2; j < n; j += i {
flag[j] = true
}
}
return cnt
}
follow up
这道题会有下面的follow up,比如说如何判断某个数x是不是质数?
解法其实类似的,都是通过埃氏筛来标记,标记到x下标即可