请求出在 12345678 至 98765432 中,有多少个数中完全不包含 2023 。
完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 。
例如 20322175,33220022 都完全不包含 2023,而 20230415,20193213 则
含有 2023 (后者取第 1, 2, 6, 8 个数位) 。(5分)
首先,我们可以发现 2023 这个数一定是八位数,且其中的数字不重复,因此只需要考虑这些数字有哪些,然后用计数法统计不包含这些数字的数的个数即可。具体做法如下:
首先求出 2023 这个数中包含的数字:
num = 2023
digits = set(str(num)) # 将数字转为字符串,再取 set,这样只会保留不重复的数字
这里使用了 set() 函数将字符串转为集合,这样可以去重并且快速判断一个数字是否在集合中。
接下来,对于每个数,我们要检查它是否包含集合 digits 中的任何一个数字。我们可以将这个检查过程封装成一个函数:
def contains_digits(n, digits):
"""判断数字 n 是否包含集合 digits 中的任意一个数字"""
return any(d in digits for d in str(n))
any() 函数可以依次检查迭代器中的每个元素是否为 True,如果有一个为 True,则 any() 函数的结果为 True。
然后,我们可以用一个循环遍历所有数字,统计不包含 digits 集合中的数字的数字的个数:
count = 0
for n in range(12345678, 98765433): # 注意要取到 98765432
if not contains_digits(n, digits):
count += 1
print(count)
这里使用了一个 not 运算符,用于判断 contains_digits(n, digits) 的结果是否为 False,即数字 n 是否包含集合 digits 中的任何一个数字。
最终,这个程序的输出就是满足题目条件的数字个数。
答案是:5487027