题目描述
在魔法世界中,数字并不像普通世界那样简单地表示。魔法师们利用两种神秘的咒语将数字转换为独特的编码方式:
· 大端表示:将数字的高位字节放置在低位地址,呈现的结果总是令人肃然起敬。
· 小端表示:将数字的高位字节放置在高位地址,展现出一种错乱却和谐的美感。
现有一个魔法输入的十进制数字(可能为负),你需要施展咒语,分别输出大端表示的结果与小端表示的结果。
注意:如果输入的数字超出了魔法范围 [-2^31, 2^32),则会引发“魔力溢出”(输出 overflow)。负数采用魔法世界的补码规则。
输入格式
一行输入:一个魔法十进制整数,可能为负数,长度范围为 [1, 32]。没有前导零。数值范围必须符合魔法规则 [-2^31, 2^32)。
输出格式
若数字在范围内:
第一行:大端表示的结果(每个字节用两位 16 进制表示,字节之间以单空格分隔)。
第二行:小端表示的结果(格式同上)。
若数字超出范围:输出字符串 overflow。
样例
输入 1
-10
输出 1
FF FF FF F6 F6 FF FF FF
说明:负数 -10 的魔法补码表示为 FF FF FF F6。大端为 FF FF FF F6,小端为 F6 FF FF FF。
输入 2
4027691818
输出 2
F0 11 B3 2A 2A B3 11 F0
输入 3
24680135791234
输出 3
overflow
说明:超出范围,输出 overflow。
题目解析
理解题目
本题以“魔法世界”为背景,要求将一个十进制整数转换成其在内存中使用的 4 字节二进制表示形式,并输出其在大端(Big-Endian)与小端(Little-Endian)字节序下的结果。核心在于:处理负数(负数以补码形式存储,需手动转为补码)、拆分为 4 个字节、每字节格式化为 2 位大写十六进制,以及合法数值必须落在 [-2^31, 2^32) 内的边界检测。
使用算法
本题并非传统意义上的“算法题”,而是考察编码与位处理:① 数值范围判断,越界直接输出 overflow;② 补码计算,负数转换为补码 补码 = (1 << 32) + 负数;③ 字节序处理,大端高位字节在前、小端低位字节在前,可借助语言内建的 to_bytes / 移位实现;④ 十六进制格式化,每个字节格式化为 2 位大写十六进制。
实现步骤
- 读取并转换输入为整数 int。
- 合法性判断:n < -2^31 或 n >= 2^32 时输出 overflow。
- 针对负数做补码转换:n = (1 << 32) + n。
- 拆出 4 个字节,分别按大端、小端顺序排列。
- 每个字节格式化为 2 位大写十六进制并以空格拼接输出。
参考代码
import sys
def solve(n: int) -> str:
# 边界检测:左闭右开 [-2^31, 2^32)
if n < -(2 ** 31) or n >= 2 ** 32:
return "overflow"
# 负数转补码,映射为无符号整数
if n < 0:
n = (1 << 32) + n
b = n.to_bytes(4, byteorder="big")
big = " ".join(f"{x:02X}" for x in b)
little = " ".join(f"{x:02X}" for x in b[::-1])
return f"{big}\n{little}"
if __name__ == "__main__":
n = int(sys.stdin.readline().strip())
print(solve(n))时空复杂度
时间复杂度
O(1)
空间复杂度
O(1)