python1到n中有多少个数满足二进制恰有k个0
时间: 2023-12-12 11:05:47 浏览: 20
我们可以通过枚举1到n中每个数的二进制表示,统计其中0的个数,最后计算满足条件的数的个数。
具体实现可以使用Python的bin()函数将十进制数转换为二进制字符串,然后在字符串中统计0的个数。
以下是一个示例代码:
```python
def count_numbers(n, k):
count = 0
for i in range(1, n+1):
binary = bin(i)[2:] # 转换为二进制字符串,去掉前缀'0b'
if binary.count('0') == k:
count += 1
return count
```
其中,参数n表示数的范围,k表示二进制中0的个数。这个函数会返回满足条件的数的个数。
相关问题
我们熟悉的是十进制数,十进制数的特点是逢十进一,即每数到10 个数就向前进一位。在编程中,我们经常使用二进制,二进制数的特点是逢二进一,二进制数只包含 0 和 1。 A. 编写一个函数,函数名字是 getHowManyZero,参数列表包含两项n 和k,返回 1 到 n 中有多少个数满足其二进制表示中恰好有 k 个0 B. 编写一个测试程序,提示用户输入正整数 N 和 K,调用函数getHowManyZero() 并输出该函数的返回值 [输入示例] Input Sample: N: 7 K: 2 [输出示例] Output Sample: 1
以下是Python代码实现:
```python
# 计算一个整数的二进制中0的个数
def countZero(n):
cnt = 0
while n > 0:
if n % 2 == 0:
cnt += 1
n //= 2
return cnt
# 计算1到n中二进制中恰好有k个0的数的个数
def getHowManyZero(n, k):
cnt = 0
for i in range(1, n+1):
if countZero(i) == k:
cnt += 1
return cnt
# 测试程序
N = int(input("请输入正整数 N:"))
K = int(input("请输入正整数 K:"))
print("1到", N, "中二进制中恰好有", K, "个0的数的个数为:", getHowManyZero(N, K))
```
如果用户输入N=7,K=2,则程序输出:
```
请输入正整数 N:7
请输入正整数 K:2
1到 7 中二进制中恰好有 2 个0的数的个数为: 1
```
这是因为,1到7中,只有数字6的二进制表示中恰好有2个0,其他数字的二进制表示中0的个数不是2个。
方格取数问题: 在一个有m×n个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。 python代码实现
以下是方格取数问题的 Python 代码实现:
```python
import math
def max_sum(nums):
m, n = len(nums), len(nums[0])
dp = [[0] * n for _ in range(1 << n)]
for i in range(n):
dp[1 << i][i] = nums[0][i]
for i in range(1, m):
for j in range(1 << n):
if bin(j).count('1') == 1:
continue
for k in range(n):
if j & (1 << k):
continue
l = math.log2(j & -j) + 1
dp[j | (1 << k)][k] = max(dp[j | (1 << k)][k], dp[j][l-1] + nums[i][k])
res = max(dp[(1 << n) - 1])
return res
# 测试
nums = [[1, 2, 3], [3, 2, 3], [2, 3, 1]]
print(max_sum(nums)) # 输出 11
```
其中,`dp[i][j]` 表示已经取到状态为 `i` 的数,并且最后一行取到了第 `j` 列的数时的最大总和。`j` 是从 0 开始的列下标,因此在转移时需要减 1。`l` 是在状态 `j` 中最后一个为 1 的位置。在计算 `l` 时,我们使用了一个技巧,即 `j & -j` 可以得到 `j` 二进制下最后一个为 1 的位置,也就是状态 `j` 中最后一个为 1 的位置。