【位运算-简单】762. 二进制表示中质数个计算置位

【题目】
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
【示例 1】
输入: L = 6, R = 10
输出: 4
解释:
6 -> 110 (2 个计算置位,2 是质数)
7 -> 111 (3 个计算置位,3 是质数)
9 -> 1001 (2 个计算置位,2 是质数)
10-> 1010 (2 个计算置位,2 是质数)
【示例 2】
输入: L = 10, R = 15
输出: 5
解释:
10 -> 1010 (2 个计算置位, 2 是质数)
11 -> 1011 (3 个计算置位, 3 是质数)
12 -> 1100 (2 个计算置位, 2 是质数)
13 -> 1101 (3 个计算置位, 3 是质数)
14 -> 1110 (3 个计算置位, 3 是质数)
15 -> 1111 (4 个计算置位, 4 不是质数)
【注意】
L, R 是 L <= R 且在 [1, 10^6] 中的整数。
R - L 的最大值为 10000。
【代码】
【Python】
在这里插入图片描述

class Solution:
    def countPrimeSetBits(self, L: int, R: int) -> int:
        def judge(num):
            if num<=1:
                return False
            for i in range(2,int(num**0.5)+1):
                if num%i==0:
                    return False
            return True
        cnt=0
        jilu=dict()
        for i in range(L,R+1):
            dic=dict(Counter(bin(i)[2:]))
            if judge(dic.setdefault("1",0)):
                cnt+=1
        return cnt

【方法2:预先设置质数数组】
在这里插入图片描述

class Solution(object):
    def countPrimeSetBits(self, L, R):
        primes = {
    
    2, 3, 5, 7, 11, 13, 17, 19}
        return sum(bin(x).count('1') in primes
                   for x in range(L, R+1))

【方法3:魔数+位运算】
在这里插入图片描述

class Solution(object):
    def countPrimeSetBits(self, L, R):
        ans=0
        for i in range(L,R+1):
            ans+=(665772>>bin(i).count('1'))&1
        return ans

魔数:665772的由来
step1:由题目中的注意事项知道:L, R 是 L <= R 且在 [1, 106] 中的整数,数字是介于1到106之间的,我们将106转换为2进制得:11110100001001000000,长度为20,所以[L,R]之间的数字中转换为二进制之后,最多有20个1,所以我们要计算【1,20】哪些是质数,这个可以很容易得出

print(len(bin(1000000)[2:]))
print(bin(1000000)[2:])
# 20
# 11110100001001000000

step2:【1,20】之间的质数有

{
    
    2, 3, 5, 7, 11, 13, 17, 19}

step3:将【1,20】之间的质数编码进二进制数字中进行表示得:魔数:665772

print(int("10100010100010101100",2))
#输出:665772
bin(i).count('1')
#这句代码的含义是:将数字i转换为2进制字符串,然后计算该字符串中包含的1的个数n,
#将魔数右移n位,

猜你喜欢

转载自blog.csdn.net/kz_java/article/details/115096586