本文主要是介绍枚举——统计所有小于非负整数 n 的质数的数量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、问题
统计所有小于非负整数 n 的质数的数量。
示例:
提示: 0 <= n <= 5 * 106
二、解题思路
很直观的思路是枚举每个数判断其是不是质数。
考虑质数的定义:在大于 1 1 1 的自然数中,除了 1 1 1 和它本身以外不再有其他因数的自然数。
因此对于每个数 x x x ,我们可以从小到大枚举 [ 2 , x − 1 ] [2, x-1] [2,x−1] 中的每个数 y y y,判断是否为 x x x 的因数。但是这样判断一个数是否为质数的时间复杂度最差情况下会到 O ( n ) O(n) O(n) ,时间复杂度高。
考虑到如果 y y y 是 x x x 的因数,那么 x y \frac{x}{y} yx 也必然是 x x x 的因数,因此我们只要校验 y y y 或者 x y \frac{x}{y} yx 即可。而如果我们每次选择校验两者中的较小数,则不难发现较小数一定落在 [ 2 , x ] [2, \sqrt{x}] [2,x] 的区间中,因此我们只需要枚举 [ 2 , x ] [2, \sqrt{x}] [2,x] 中的所有数即可,这样单次检查的时间复杂度从 O ( n ) O(n) O(n) 降低至了 O ( n ) O(\sqrt{n}) O(n)。
三、代码
bool isPrime(int x) {for (int i = 2; i * i <= x; ++i) {if (x % i == 0) {return false;}}return true;
}int countPrimes(int n) {int ans = 0;for (int i = 2; i < n; ++i) {ans += isPrime(i);}return ans;
}
四、复杂度分析
- 时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn)
- 空间复杂度: O ( 1 ) O(1) O(1)
五、参考
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
来源:力扣(LeetCode)
这篇关于枚举——统计所有小于非负整数 n 的质数的数量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!