204. 计数质数
题意
统计所有小于非负整数
n
的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
解题思路
这道题是经典题,如果用暴力肯定会超时.用埃氏筛法即可
问 答 怎么判断一个数是质数? 该数的因数只有1和它本身就是质数 那么怎么判断一个数是合数? 有其他的因数,所以我们可以根据质数来把合数全部推出来.(重要思想) 怎么找出全部合数? 如果该数是质数,只需要从2开始乘,直到数大于某个顶值,就等于找出这个值内该质数的倍数,也就是合数.
- 埃尔筛法是这道题的经典解法.它可以不用判断每一个数是否为合数,因为是从2开始的,所以会找出全部的合数.
代码:
class Solution {
public:
int countPrimes(int n) {
//用于标记是否是合数
vector<bool> hash(n, false);
int count = 0;
//从2开始找质数
for (int i = 2; i < n; i++)
{
//如果为false就说明是质数
if (!hash[i])
{
//数量+1
count++;
//用质数找合数,打上标记
for (int j = i * 2; j < n; j += i)
{
hash[j] = true;
}
}
}
//返回个数
return count;
}
};
总结
其实这道题还可以剪枝的,因为不需要每次都从
2 * i
开始,因该是从i * i
开始,因为有些是重复的,但是用i * i
会导致数据溢出,用了long long 依旧溢出,所以没办法只能从2开始.索性时间也挺快