题目描述
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 1 0 6 {10^6} 106
代码实现【埃筛法】
/*一开始假设都是质数,用0表示,在前边遍历的过程中就把后边的非质数给打上标记,也就是记为1
所以当遍历到后边的数的时候,压根就不用再单独设置一个函数去判断它能不能整除因子
*/
class Solution {
public:
int countPrimes(int n) {
int count=0;
int prime[5000005]={0};
for(int i=2;i<n;i++){ //看一下有多少个质数
if(prime[i]==0){
count++;
//把i乘以某个倍数beishu的值都打上标记,
//这个倍数不需要从2开始,≥i的就行,因为前边的小倍数比如2,早已经去挨个乘以倍数打过标了
for(int beishu=i; (long long)beishu*i<n; beishu++){
//注意这里beishu*i可能会超出int的范围,
//虽然n不超int,但是要先算beishu*i再和n比较,所以存在超int的可能
prime[beishu*i]=1;
}
}
}
return count;
}
};