762. 二进制表示中质数个计算置位题解
题目来源:762. 二进制表示中质数个计算置位
2022.04.05 每日一题
LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址
今天的题目比较简单,查找范围 [left,right]
中 1 的个数是质数的个数
法一:模拟
我们最首先想到的方法就是,首先通过位运算找出当前数字 i
中的 1 的个数
然后判断其对应的值是否是质数
class Solution {
public:
int countPrimeSetBits(int left, int right) {
// 创建变量统计满足要求的个数
int res = 0;
// 遍历范围,开始进行统计
for (int i = left; i <= right; i++) {
// 创建变量统计当前数字 i 中 1 的个数
int cnt = 0;
int temp = i;
// 使用位运算进行统计
while (temp != 0) {
cnt += (temp & 1);
temp >>= 1;
}
// 如果 统计的个数是质数,结果中就加一
if (check(cnt)) res++;
}
return res;
}
// 判断数字 q 是否为 质数
bool check(int q) {
// 这里要注意,1 不是质数
if (q == 1) return false;
int s = (int) sqrt(q);
for (int i = 2; i <= s; i++) {
if (q % i == 0) return false;
}
return true;
}
};
class Solution {
public int countPrimeSetBits(int left, int right) {
// 创建变量统计满足要求的个数
int res = 0;
// 遍历范围,开始进行统计
for (int i = left; i <= right; i++) {
// 创建变量统计当前数字 i 中 1 的个数
int cnt = 0;
int temp = i;
// 使用位运算进行统计
while (temp != 0) {
cnt += (temp & 1);
temp >>= 1;
}
// 如果 统计的个数是质数,结果中就加一
if (check(cnt)) res++;
}
return res;
}
// 判断数字 q 是否为 质数
public boolean check(int q) {
// 这里要注意,1 不是质数
if (q == 1) return false;
int s = (int) Math.sqrt(q);
for (int i = 2; i <= s; i++) {
if (q % i == 0) return false;
}
return true;
}
}
法二:优化
由题目我们可以知道,我们 right
是范围是小于
1
0
6
10^6
106的,因此我们可以使用 20个位的二进制数字来表示,将 20 个位中的质数置为 1,其余的置为 0,可得到数字
mask
=
665772
=
1010001010001010110
0
2
\textit{mask}=665772=10100010100010101100_{2}
mask=665772=101000101000101011002,我们将数字 i 的 1 的个数统计为 cnt
,将
2
c
n
t
2^ {cnt}
2cnt与 mask 进行 与 操作,如果不为 0 ,则说明其中包含 1 的个数为 质数
class Solution {
public:
int countPrimeSetBits(int left, int right) {
// 创建变量统计满足要求的个数
int res = 0;
// 遍历范围,开始进行统计
for (int i = left; i <= right; i++) {
// 创建变量统计当前数字 i 中 1 的个数
int cnt = 0;
int temp = i;
// 使用位运算进行统计
while (temp != 0) {
cnt += (temp & 1);
temp >>= 1;
}
// 如果 统计的个数是质数,结果中就加一
if (((int) Math.pow(2, cnt) & 665772) != 0) res++;
}
return res;
}
};
class Solution {
public int countPrimeSetBits(int left, int right) {
// 创建变量统计满足要求的个数
int res = 0;
// 遍历范围,开始进行统计
for (int i = left; i <= right; i++) {
// 创建变量统计当前数字 i 中 1 的个数
int cnt = 0;
int temp = i;
// 使用位运算进行统计
while (temp != 0) {
cnt += (temp & 1);
temp >>= 1;
}
// 如果 统计的个数是质数,结果中就加一
if (((int) Math.pow(2, cnt) & 665772) != 0) res++;
}
return res;
}
}