题目
思路一 模拟
根据题意模拟,遍历范围内所有数,根据lowbit计算置数位数,再判断置位位数是否是质数。
代码一
class Solution {
public:
bool isPrime(int x){
if(x == 1) return false;
for(int i = 2; i <= sqrt(x); i++){
if(x % i == 0)
return false;
}
return true;
}
int lowbit(int x){
return x & (-x);
}
int countPrimeSetBits(int left, int right) {
int ans = 0;
for(int i = left; i <= right; i++){
int cnt = 0, x = i;
while(x){
x -= lowbit(x);
cnt++;
}
if(isPrime(cnt)) ans++;
}
return ans;
}
};
思路二 判断质数优化
根据数据的范围,可以得到置位位数的范围是2,3,5,7,11,13,17,19,那么可以用一个二进制数mask来存储这些质数。
代码二
class Solution {
public:
int countPrimeSetBits(int left, int right) {
int ans = 0;
for(int i = left; i <= right; i++){
if((1 << __builtin_popcount(i)) & 665772)
++ans;
}
return ans;
}
};