方法一:枚举
class Solution {
public:
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;
}
};
方法二:制表法(重点
)
- 首先将所有的数都设置为素数(标记为1);
- 从第一个素数2开始到n遍历,如果当前的数为素数,那么result+1,并且将素数的倍数全部设置为不是素数(标记为0);
下面有两组代码,k从i开始是优化的,从2开始也可以,只不过这样有点重复(比如一个数x=2*i,这个数是i的倍数,同样也是2的倍数呀,那这个x就在i=2的时候就已经设置过了)。
for(int k=i;(long long)i*k<n;k++){
isprime[i*k]=0;
}
class Solution {
public:
int countPrimes(int n) {
vector<int>isprime(n+1,1);
int result=0;
for(int i=2;i<n;i++){
if(isprime[i]==1){
result++;
for(int k=2;i*k<n;k++){
isprime[i*k]=0;
}
// for(int k=i;(long long)i*k<n;k++){
// isprime[i*k]=0;
// }
}
}
return result;
}
};
这两天天气有点冷,感觉快感冒了