1.题目
2.求解
看到这题的时候我第一想到的是数位dp的方式去求解 但是太久每做数位dp 模板忘了 待我再去学习一下数位dp的题目再来看看这道题会不会有新的想法
这道题最后使用了lowbit去求解,对一个数的二进制找到它的最后一位1,减去即可,cnt共有多少个1,质数方面因为 10的6次方<2的20次方 因此开个20的数组就好了 20以内的质数掰着手指头数出来(笑)
3.代码
class Solution {
public:
bool zhishu[25];
void init(){
int nums[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
memset(zhishu, 0,sizeof(zhishu));
for(int i = 0; i < 9; i++){
zhishu[nums[i]] = 1;
}
}
int countPrimeSetBits(int left, int right) {
init();
int ret = 0;
for(int i = left; i <= right; i++){
int cnt = 0;
int j = i;
while(j > 0){
j -= (j & (-j));
cnt++;
}
if(zhishu[cnt]) ret ++;
}
return ret;
}
};
这个代码不算是很好 我看了一眼别人的题解 最优的方案是使用GCC的一个自带函数__builtin_popcount() 这个函数是直接求二进制数内有几个1 很方便 但是也有一个问题 这个函数只能在GCC内使用(如果我没记错的话)可能JAVA PYTHON会有更方便的扩展方法
有的话请告诉我, 互相学习!!