进制转换

GitHub跳转原题关系图返回列表

用 int(text, base) 转成十进制整数,再反复 divmod 得到目标进制数码。

OJ: luogu

题目 ID: P1143

难度:入门

标签:进制转换字符串divmodpython

日期: 2026-07-16 19:20

题意

把一个 2..16 进制的非负整数转换成另一个 2..16 进制表示。

思路

先把源字符串转换为整数,再做目标进制短除法。每次 divmod(value,base) 得到新的商和最低位余数,余数映射到 0..F;数码按低位到高位产生,最后反转。

值为 0 时短除循环不会执行,需要单独输出 0

Python 知识

  • int(number,source_base) 原生支持 2 到 36 进制字符串解析。
  • divmod(a,b) 一次返回商和余数。
  • DIGITS[remainder] 把 10 到 15 映射为大写字母。
  • "".join(reversed(converted)) 连接逆序产生的数码。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:字符串解析、切片与连接。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/cpp_to_python_pitfalls.md:Python 整数与 C++ 数值范围差异。

代码

python
import sys


DIGITS = "0123456789ABCDEF"


def main():
    source_base, number, target_base = sys.stdin.buffer.read().split()
    value = int(number, int(source_base))
    base = int(target_base)

    if value == 0:
        print(0)
        return

    converted = []
    while value:
        value, remainder = divmod(value, base)
        converted.append(DIGITS[remainder])
    print("".join(reversed(converted)))


if __name__ == "__main__":
    main()
cpp
/**
 * P1143 进制转换
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-27 00:00
 * update_at: 2026-07-27 00:00
 */

#include <bits/stdc++.h>
using namespace std;

const char DIGITS[] = "0123456789ABCDEF";

int main() {
    int src_base, dst_base;
    char num[40];
    scanf("%d%s%d", &src_base, num, &dst_base);
    // 任意进制 → 十进制
    int val = 0;
    for (int i = 0; num[i]; ++i) {
        char c = num[i];
        int d = isdigit(c) ? c - '0' : c - 'A' + 10;
        val = val * src_base + d;
    }
    // 十进制 → 目标进制
    char ans[40];
    int len = 0;
    if (val == 0) ans[len++] = '0';
    while (val) {
        ans[len++] = DIGITS[val % dst_base];
        val /= dst_base;
    }
    for (int i = len - 1; i >= 0; --i) putchar(ans[i]);
    putchar('\n');
    return 0;
}

复杂度

设目标表示有 d 位,短除部分时间复杂度 O(d)O(d),空间复杂度 O(d)O(d)

总结

Python 已经解决“任意进制字符串到整数”,我们只需掌握整数到目标进制的 divmod 模板。