笔试-二进制
应用题
将符合区间[l,r]内的十进制整数转换为二进制表示,请问不包含“101”的整数个数是多少?
实现
l = int(input("请输入下限l,其值大于等于1:"))
r = int(input("请输入上限r,其值大于等于l:"))
binary_list = []
# 默认值为0,对应数值为1,未反转
def decimal_to_binary(number):
if number == 0:
# 第一次要对空列表配置,否则后面的替换会报错
if len(binary_list) == 0:
binary_list.append(0)
else:
binary_list[0] = 0
else:
N = 0
# 当次二进制临界值
while 2**N <= number:
N = N + 1
# 第一次要对空列表配置,否则后面的替换会报错
if len(binary_list) == 0:
# 设置列表长度为N,全元素置0
for i in range(0, N):
binary_list.append(0)
# 临界值位置元素置1
binary_list[N-1] = 1
left_number = number - 2**(N-1)
if left_number > 0:
decimal_to_binary(left_number)
# 27 = 16 + 8 + 2 + 1
# 10 = 8 + 2
# decimal_to_binary(32)
# decimal_to_binary(0)
# decimal_to_binary(27)
# decimal_to_binary(10)
# binary_list.reverse()
# print(binary_list)
# string = ""
# for i in binary_list:
# string = string + str(i)
# print(f"二进制为:{string}")
collections = []
# 范围内的二进制数,构建二维新列表
for i in range(l, r+1):
decimal_to_binary(i)
binary_list.reverse()
# 长度小于3的列表一定没有“101”
if len(binary_list) >= 3:
collections.append(binary_list)
# 再清空
binary_list = []
print(collections)
sum = 0
for i in range(0, len(collections)):
for j in range(0, len(collections[i])-2):
if collections[i][j] == 1 and collections[i][j+1] == 0 and collections[i][j+2] == 1:
sum = sum + 1
print(f"不包含“101”的整数个数为{len(collections)-sum}。")
输入下限l,其值大于等于1:2
请输入上限r,其值大于等于l:10
[[1, 0, 1], [1, 1, 0], [1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0]]
不包含“101”的整数个数为4。