自定义基数下序列与数字互转的Python代码问题排查
N进制序列与数字互转问题排查与修正
原代码问题分析
暴力解法(itertools版本)
- 硬编码长度限制:
repeat=4固定了只能处理长度为4的序列,无法适配任意长度的输入 - 效率极差:枚举所有可能的N进制组合,当BASE或序列长度较大时,计算量呈指数级增长,完全属于冗余实现
数学计算版本
seq_to_num 错误
指数计算逻辑错误:enumerate的索引从0开始,原代码中pow(BASE, size - i)的指数偏大。正确的指数应为size - 1 - i——序列第一个元素是最高位,对应BASE^(size-1),最后一个元素是最低位,对应BASE^0。
比如输入[0,0,1,0],原代码计算为0*64^4 + 0*64^3 + 1*64^2 + 0*64^1 = 4096,但正确结果是0*64^3 + 0*64^2 +1*64^1 +0*64^0=64。
num_to_seq 错误
- 数组操作逻辑混乱:初始化
[0]*places后用insert(0, rem)会导致数组长度超过指定的places,且填充方向完全错误 - 返回值类型不符:
reversed(seq)返回的是迭代器,不是需求要求的列表类型 - 未处理前置补0:当数字转换后的序列长度小于
places时,没有在前方补0以满足长度要求
修正后的代码
BASE = 64 def seq_to_num(seq): size = len(seq) # 指数从size-1递减到0,匹配每个数位的权重 return sum(digit * pow(BASE, size - 1 - i) for i, digit in enumerate(seq)) def num_to_seq(num, places): seq = [] # 从最低位开始提取余数 while num > 0: num, rem = divmod(num, BASE) seq.append(rem) # 反转得到高位到低位的序列,补0至指定长度 seq = seq[::-1] return [0]*(places - len(seq)) + seq
验证示例
# 验证seq_to_num assert seq_to_num([0, 0, 0, 0]) == 0 assert seq_to_num([0, 0, 0, 1]) == 1 assert seq_to_num([0, 0, 1, 0]) == 64 assert seq_to_num([63, 63, 63, 63]) == 64**4 - 1 # 验证num_to_seq assert num_to_seq(67, 4) == [0, 0, 1, 3]
内容的提问来源于stack exchange,提问作者user37741
相关产品推荐
相关产品推荐

