以十进制为桥梁做任意进制互转:int(s, a) 按权解析 a 进制,再除基取余压成 b 进制,两段各线性一遍。
OJ: roj
题目 ID: 8006
难度:入门
标签:进制转换模拟python
创建: 2026-10-02 16:22
更新: 2026-10-02 16:30
形式化题目
给定 0-9 表示 A-Z 依次表示
样例:123ABC 16 2 表示把 123ABC 转成 100100011101010111100。
正解
思路
进制表示的定义本身就是「按位权展开」:
所以任意两种进制互转的通用做法是拿十进制当桥梁,两段各自独立完成:
进制 十进制:逐字符映射数位( 0-9/A-Z→),按权求和。Python 的内建 int(s, a)恰好实现这一步,且天然支持进制与大写字母,与题面数符约定完全一致。 - 十进制
进制:对 反复 divmod(v, b),每次余数就是当前最低位,商是剩余高位;循环取完后余数序列是低位到高位,倒序拼接即答案。
下面用样例展示两段的中间量(第一段按权求和,第二段除
| 阶段 | 数位/步骤 | 贡献 | 累计值 |
|---|---|---|---|
1 |
|||
2 |
|||
3 |
|||
A |
|||
B |
|||
C |
|||
余数(低位→高位):001111010101110001001 |
— | ||
| 余数倒序 | 100100011101010111100 |
— |
表格前六行是第一段(按权求和得到十进制 int 本身是任意精度)。
不需要按子任务分层:
代码
python
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 数符表:下标即位值,>=10 用大写字母DIGITS把「位值 → 数符」的映射收成一张表,下标即数值,第二段直接查表。to_base(value, base)实现除基取余;value == 0显式返回"0",因为循环对不执行,否则会得到空串。 solve()用iter(...split())流式取 token,int(s, a)完成第一段解析,结果收集进out后一次性输出。
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 16:22
# update_at: 2026-10-02 16:22
import sys
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 数符表:下标即位值,>=10 用大写字母
def to_base(value: int, base: int) -> str:
"""十进制整数转 base 进制字符串:反复除 base 取余,余数倒序即高位在前。"""
if value == 0:
return "0"
out: list[str] = []
while value:
value, r = divmod(value, base)
out.append(DIGITS[r])
return "".join(reversed(out))
def solve() -> None:
data = iter(sys.stdin.read().split())
n = int(next(data))
out: list[str] = []
for _ in range(n):
s = next(data) # a 进制的原数
a, b = int(next(data)), int(next(data))
# int(s, a) 直接按 a 进制解析(0-9/A-Z 均支持),再压成 b 进制
out.append(to_base(int(s, a), b))
print("\n".join(out))
if __name__ == "__main__":
solve()复杂度
- 时间:设
长度为 、输出长度为 。解析 ,压位 ,且 。单用例 ,全体 ,与 C++ 正解同阶(都是线性扫描两遍)。 - 空间:单用例
,输出缓冲累计 字符,远低于 MB 限制。
总结
- 任意进制互转的标准模型:以十进制为桥梁,「按权求和」进,「除基取余」出,两段各线性一遍。
- Python 落地时第一段直接用内建
int(s, a)(支持进制、 0-9A-Z),只需手写第二段压位。 - 边界记忆:数值为
时除基取余循环不执行,必须单独返回 "0"。 - 验证:真实数据
组全部 PASS,单测例 s、峰值内存 MB。