题目
给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。
计算置位位数 就是二进制表示中 1 的个数。
例如, 21 的二进制表示 10101 有 3 个计算置位
题目分析
这道题本身就不难,不过还是能学到不少东西的
统计二进制中 1的个数
直接将十进制转为二进制
这里直接统计就行
int count(int num){
int n =0;
while(num){
n += (num%2);
num /= 2;
}
//cout<<"n: "<<n<<endl;
return n;
}
使用内置函数
__builtin_popcount()函数是c++自带的统计1的函数,直接调用就行
判断是否是质数
六素数法
我个人还是强烈推荐这种方法的,既省时间又省空间,通过质数(除了2,3)只会出现在6倍数的两侧的特性来进行判断
bool isPrime(int n){
if(n == 1) return false;
if(n == 2 || n == 3 ) return true;
if(n%2 == 0 || n%3 == 0) return false;
int k = sqrt(n) + 1;
for(int i = 5;i<k;i+=6){
if( n % i == 0 || n % (i+2) == 0 ){
return false;
}
}
return true;
}
直接打表
因为题目的限制,这里最多也就只能到31位,所以统计一下31位以内的质数就行,
unordered_set<int> prime = {2,3,5,7,11,13,17,19,23,29,31};