题目描述:
解法一(厄拉多塞筛法):
class Solution {
public:
int countPrimes(int n) {
vector<bool> dp(n,0);
int res=0;
for(int i=2;i<n;i++){
if(dp[i]==0){
res++;
for(int j=i;j<n;j+=i)
dp[j]=1;
}
}
return res;
}
};
解法二(优化内存的厄拉多塞筛法):
class Solution {
public:
int countPrimes(int n) {
vector<int> dp(n/32+1,0); //一共需要n个二进制位来存储状态
int res=0;
for(int i=2;i<n;i++){
if((dp[i/32]&(1<<(i%32)))==0){ //第i个二进制位为0
res++;
for(int j=i;j<n;j+=i){
dp[j/32]|=1<<(j%32); //将i的倍数位置1
}
}
}
return res;
}
};