📅  最后修改于: 2023-12-03 15:06:05.550000             🧑  作者: Mango
在计算机科学和数学中,X位数为一位的N位数是指N位数字中,至少有一些数字的值恰好为X。例如,3位数为一位的4位数有301、312、321、310、341、314、341、345等8个。编写一个程序来计算一个数位为X的N位数的个数。
输入两个整数X和N(1 <= X <= 9,1 <= N <=18)
计算数位为X的N位数的个数。
输入:
2 3
输出:
30
这里的数为 [从左边数第一位数字, 第二位数字, ..., 最后一位数字],有可能以 0 开头。
有 30 个数满足恰好有一个 2,它们是:
201, 210, 212, 213, 214, 215, 216, 217, 218, 219,
231, 241, 251, 261, 271, 281, 291, 312, 322, 332,
342, 352, 362, 372, 382, 392, 412, 422, 432, 和 442。
def countXDigitNumbers(num_digits: int, x: int) -> int:
"""
计算X位数为一位的N位数的计数
"""
if num_digits==1:
return int(x>=1) # 如果num_digits只有1位, 则我们看数字x是否横跨在1到9的区域
if x==1:
# checks if there's a 1 at the most significant digit:
return int(9*countXDigitNumbers(num_digits-1,0))
else:
# countXDigitNumbers(num_digits, x) =
# countXDigitNumbers(num_digits-1, 0 to x-1 and x)
# + countXDigitNumbers(num_digits-1, x+1 to 9)
return int((x)*countXDigitNumbers(num_digits-1,0) + 9*countXDigitNumbers(num_digits-1,x+1))
# Testing the solution with the examples in the prompt:
assert(countXDigitNumbers(1, 2) == 1)
assert(countXDigitNumbers(2, 2) == 9)
assert(countXDigitNumbers(3, 2) == 30)
assert(countXDigitNumbers(3, 3) == 139)