版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83549368
1.题目
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
2.思路
step1:把L到R的数字依次换算成二进制
step2:把二进制数中的1统计出来,c
step3:判断c是不是素数
3.代码
class Solution {
public:
bool isprime(int n){
if(n==1||n==0)
return false;
else{
for(int i=2;i<=n/2;i++){
if(n%i==0)
return false;
}
return true;
}
}
int countPrimeSetBits(int L, int R){
int res=0;
for(int i=L;i<=R;i++){
int div=i;
int c=0;
while(div){
int j=div%2;
if(j==1)
c++;
div/=2;
}
if(isprime(c))
res++;
}
return res;
}
};
4.优秀案例
class Solution
{
public:
int countPrimeSetBits(int L, int R)
{
int count = 0; //质数的个数
int data; //计算置位的一个中间值
int n; //计算置位
bool isRight;
//int prime[] = {2, 3, 5, 7, 11, 13, 17, 19};
for(int i = L; i <= R; i++)
{
data = i;
n = 0;
isRight = true;
while(data != 0)
{
n++;
data = (data & (data - 1));
}
if(n == 1 || n == 0)
{
isRight = false;
}
for(int j = 2; j < n; j++)
{
if(n % j == 0)
{
isRight = false;
break;
}
}
if(isRight)
{
count++;
}
}
return count;
}
};