📜  门|门CS 2010 |第 62 题(1)

📅  最后修改于: 2023-12-03 14:58:37.031000             🧑  作者: Mango

题目介绍

本题为“门|门CS 2010”比赛的第 62 题,题目名称为“进制数”。

本题要求参赛者编写一个程序,将一个数字转换为特定进制的表达形式。具体要求如下:

  • 输入数据:一个十进制整数 $n$ 和一个正整数 $k$,表示将 $n$ 转化为 $k$ 进制。
  • 输出数据:一个字符串,表示 $n$ 在 $k$ 进制下的表达形式。其中,如果某位是 $10$ 以上的数字,则使用大写字母表示(即 $A=10,B=11,C=12,\cdots$)。
实现思路

对于任意整数 $n$,可以通过不断对 $n$ 取模、除以 $k$ 的方式,得到它在 $k$ 进制下的表达形式,每一位即为 $n$ 取模 $k$ 的结果。需要注意以下几点:

  1. 若 $n<0$,则需要将其转化为正数,再按照上述方式进行操作,并在结果前加上负号。
  2. 当 $n=0$ 时,直接返回 $0$。
  3. 转化为 $k$ 进制后,得到的字符串需要进行反转。

根据以上思路,可以编写如下的 Python 代码:

def to_k_base(n: int, k: int) -> str:
    if n == 0:
        return "0"
    if n < 0:
        n = -n
        sign = "-"
    else:
        sign = ""
    res = ""
    while n:
        n, mod = divmod(n, k)
        if mod < 10:
            res += str(mod)
        else:
            res += chr(ord("A") + mod - 10)
    return sign + res[::-1]
测试样例

可以使用以下测试样例对上述代码进行验证:

assert to_k_base(123456, 16) == "1E240"
assert to_k_base(123456, 10) == "123456"
assert to_k_base(-123456, 16) == "-1E240"
assert to_k_base(-123456, 10) == "-123456"
assert to_k_base(0, 16) == "0"