不含101的数的区间计数问题

算法题目

小明在学习二进制知识的过程中,留意到了一类特殊的数,这类数在以二进制形式表示时,不会出现“101”这样的组合。现在给出一个正整数区间[l, r],你需要编写一个程序,计算出这个区间内所有不含“101”的数的数量。

输入要求为一行,包含两个正整数lr,这两个数的取值范围是1 <= l < r <= 10^9

输出同样为一行,包含一个整数,这个整数代表了区间[l, r]内不含“101”的数的个数。

下面给出两个示例来帮助你更好地理解题目:

示例一

输入

1 10

输出

8

说明:在区间[1, 10]里,数字5的二进制表示是101,数字10的二进制表示是1010,这两个数包含“101”,不满足条件,而其他数字都满足条件,所以满足条件的数字个数是8。

示例二

输入

10 20

输出

7

说明:在区间[10, 20]内,满足条件的数字有[12, 14, 15, 16, 17, 18, 19],因此答案是7。

解题思路

要解决这个问题,我们可以采用遍历区间内所有数字的方法。对于区间[l, r]中的每一个数字,我们需要将其转换为二进制形式,然后检查这个二进制表示中是否包含“101”。具体步骤如下:

  1. 对区间[l, r]内的每一个数字进行遍历。
  2. 利用编程语言提供的函数(如Python中的bin函数)将当前遍历到的数字转换为二进制数。
  3. 检查转换后的二进制数中是否包含“101”。如果不包含,就把满足条件的数字个数加1。
  4. 遍历完整个区间后,返回满足条件的数字的总个数。

示例代码

以下是使用Python实现的代码:

def solve_method(l, r):
    count = 0
    for i in range(l, r + 1):
        i_bin = bin(i)
        if '101' not in i_bin:
            count += 1

    return count


if __name__ == '__main__':
    assert solve_method(1, 10) == 8
    assert solve_method(10, 20) == 7

在这段代码中,solve_method函数接收区间的左右边界lr作为参数。通过for循环遍历这个区间内的所有数字,使用bin函数将数字转换为二进制表示,再通过if语句检查二进制表示中是否包含“101”,若不包含则将计数器count加1。最后返回计数器的值,即满足条件的数字个数。if __name__ == '__main__':部分用于测试函数的正确性,通过断言来验证函数在示例输入下的输出是否正确。

你可能感兴趣的:(算法,数据结构,个人开发)