Python中无需转十进制的任意进制整数乘法实现方案问询
Python中无需转十进制的任意进制整数乘法实现
Python标准库没有专门提供直接处理任意进制整数乘法且不转换为十进制的工具,但可以通过模拟竖式乘法的方式高效实现,完全规避十进制转换步骤。
核心思路
- 字符转数字列表:将输入的进制字符串(如"b5")转换为对应数值的列表(如
[11, 5],其中b对应14进制的11),方便逐位计算。 - 竖式乘法累加:用其中一个数的每一位去乘另一个数的每一位,将结果累加到对应位置(类似小学竖式乘法的错位相加)。
- 处理进位:从低位到高位遍历,将每一位的数值对
base取余得到当前位,商作为进位传递到高位。 - 数字转进制字符串:将处理后的数字列表转换回对应进制的字符形式(如11转回
b)。
代码实现
def arbitrary_base_multiply(base: int, a: str, b: str) -> str: # 定义字符与数字的映射(支持0-9,a-z对应10-35,覆盖常见进制需求) char_to_num = {str(i): i for i in range(10)} char_to_num.update({chr(ord('a') + i): 10 + i for i in range(26)}) num_to_char = {v: k for k, v in char_to_num.items()} # 将输入字符串转为数字列表(高位在前) num_a = [char_to_num[c.lower()] for c in a] num_b = [char_to_num[c.lower()] for c in b] # 初始化结果数组,长度为两个数的长度之和 result = [0] * (len(num_a) + len(num_b)) # 模拟竖式乘法,从低位到高位计算 for i in reversed(range(len(num_a))): for j in reversed(range(len(num_b))): # 计算当前位的乘积,累加到对应位置 product = num_a[i] * num_b[j] pos = i + j + 1 result[pos] += product # 提前处理进位,避免后续数值过大 result[pos - 1] += result[pos] // base result[pos] = result[pos] % base # 去除前导零 while len(result) > 1 and result[0] == 0: result.pop(0) # 转换为进制字符串 return ''.join([num_to_char[num] for num in result])
测试验证
针对题目中的例子:
print(arbitrary_base_multiply(14, "b5", "2a")) # 输出: 22b8
对应十进制验证:159 * 38 = 6042,与int("22b8", 14)的结果一致,验证正确。
内容的提问来源于stack exchange,提问作者Rexcirus
相关产品推荐
相关产品推荐

