Description
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime
number of set bits in their binary representation.
(Recall that the number of set bits an integer has is the number of 1s present when written in
binary. For example, 21 written in binary is 10101 which has 3 set bits. Also, 1 is not a prime.)
Example 1
Input: L = 6, R = 10
Output: 4
Explanation:
6 -> 110 (2 set bits, 2 is prime)
7 -> 111 (3 set bits, 3 is prime)
9 -> 1001 (2 set bits , 2 is prime)
10->1010 (2 set bits , 2 is prime)
Example 2
Input: L = 10, R = 15
Output: 5
Explanation:
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
15 -> 1111 (4 set bits, 4 is not prime)
Note
1.L, R will be integers L <= R in the range [1, 10^6].
2.R - L will be at most 10000.
Solution 1(C++)
static int x = [](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
int countPrimeSetBits(int L, int R) {
int count = 0;
for(int x = L; x <= R; x++)
{
bitset<32> bits(x);
int n = bits.count();
if(n == 2 || n == 3 || n == 5 || n == 7 || n == 11 || n == 13 || n == 17 || n == 19) count++;
}
return count;
}
};
Solution 2(C++)
static int x=[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
int countPrimeSetBits(int l, int r) {
set<int> primes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
int cnt = 0;
for (int i = l; i <= r; i++) {
int bits = 0;
for (int n = i; n; n >>= 1)
bits += n & 1;
cnt += primes.count(bits);
}
return cnt;
}
};
算法分析
这道题的算法中使用了bitset这个数据结构。值得好好注意下。后面也是会专门整理一下这个容器的。
要说的有一点,那就是其实特殊情况要学会融会贯通,灵活一点。判断一个数是不是质数当然可以从其定义上来判断。但是在情况限定较多的时候,可以直接罗列出来,这样会节约很多程序运行时间。
程序分析
bitset容器学习后两天会抽时间整理的。