用 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 位,短除部分时间复杂度
总结
Python 已经解决“任意进制字符串到整数”,我们只需掌握整数到目标进制的 divmod 模板。