📜  X位数为一位的N位数的计数(1)

📅  最后修改于: 2023-12-03 15:06:05.550000             🧑  作者: Mango

X位数为一位的N位数的计数

在计算机科学和数学中,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)