【LeetCode】 762. 二進位制表示中質數個計算置位
阿新 • • 發佈:2018-11-03
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;
}
};