1. 问题描述:
如果一个正整数,其各个数位上的数字均满足要么是 0,要么是 1,则称该数字为 01 数。例如,1 和 10 都是 01 数。给定一个整数 n。请你计算,1∼n 中有多少个 01 数。
输入格式
一行,一个整数 n。
输出格式
一个整数,表示 01 数的数量。
数据范围
前六个测试点满足 1 ≤ n ≤ 100。
所有测试点满足 1 ≤ n ≤ 10 ^ 9。
输入样例:
10
输出样例:
2
来源:https://www.acwing.com/problem/content/description/4204/
2. 思路分析:
分析题目可以知道每一位要么是0要么是1,n最大是10 ^ 9,所以最多有10位,而实际上在填的时候只有9位数字,n = 10 ^ 9最高位是1其余位全为0是固定的,所以最多的方案数目为2 ^ 9 - 1 + 1 = 512种,其中需要加上1000000000这个数字和减去0这个数字,所以总共的状态数目是非常少的,所以我们可以从1枚举到2 ^ 10 - 1,然后计算每一个二进制状态对应的十进制数字x,判断是否小于等于n即可,如果小于等于n说明符合要求。
3. 代码如下:
class Solution:
def process(self):
n = int(input())
res = 0
# 枚举的相当于是每一位是0或者1对应的所有二进制状态, 然后将其转为十进制数字判断是否小于等于n即可
for i in range(1, 1 << 10):
x = 0
for j in range(10):
# x为当前的二进制状态对应的十进制数字
x = x * 10 + (i >> j & 1)
# 判断当前对应的十进制数字是否小于等于n
if x <= n: res += 1
return res
if __name__ == '__main__':
print(Solution().process())