统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
暴力法
class Solution {
public:
bool prime(int n)
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
return false;
}
return true;
}
int countPrimes(int n) {
int ans=0;
for(int i=2;i<n;i++)
{
if(prime(i))
ans++;
}
return ans;
}
};
暴力法优化
class Solution {
public:
bool prime(int n)
{
for(int i=3;i*i<=n;i+=2)
{
if(n%i==0)
return false;
}
return true;
}
int countPrimes(int n) {
int ans=0;
if(n>2)
ans=1;
for(int i=3;i<n;i++)
{
if((i&1)==0)
continue;
if(prime(i))
ans++;
}
return ans;
}
};
厄拉多塞筛法
一层一层的筛选,把2的倍数筛掉;把3的倍数筛掉;把4的倍数筛掉…
class Solution {
public:
int countPrimes(int n) {
int count = 0;
//初始默认所有数为质数
vector<bool> signs(n, true);
for (int i = 2; i < n; i++) {
if (signs[i]) {
count++;
for (int j = i + i; j < n; j += i) {
//排除不是质数的数
signs[j] = false;
}
}
}
return count;
}
};
厄拉多塞筛法优化
主要是跳过偶数项
class Solution {
public:
int countPrimes(int n) {
int ans=0;
if(n>2)
ans=1;
vector<bool> vec(n,true);
for(int i=3;i<n;i+=2)//跳过偶数
{
if(vec[i])
ans++;
if(i<=n/i)//只需要判断<根号n,因为n以内的值分解,必有一个值是小于根号n的
{
for(int j=3;j*i<n;j+=2)//跳过偶数项
{
vec[j*i]=0;
}
}
}
return ans;
}
};