如何用Python编写函数对输入的n进制数求和并返回对应n进制结果
原有代码问题梳理
- 代码缩进错误:函数定义下的逻辑代码没有正确缩进,运行会直接触发语法错误
- 仅遍历了一次所有输入数字,只计算了最低位的和,没有循环处理更高数位,也没有处理高位计算时的进位传递
- 进位计算逻辑顺序错误:原代码先对tot取余再计算进位,导致carry取值错误,正确顺序应该是先算进位
carry = tot // base,再取当前位值tot = tot % base - 取高位的运算错误:原代码用
num // 10取高位,仅适用于十进制场景,不同进制下应该用num // base取当前数的高位部分 - 缺少持续循环逻辑:没有判断所有数字是否还有未处理的高位,也没有判断剩余进位是否需要继续计算高位
修复后的实现代码
def sum_base(base, *args): s = "" carry = 0 # 把所有输入的数字转成可变列表,方便后续逐位处理后更新 nums = list(args) # 只要还有未处理完的数字,或者还有进位,就继续循环处理高位 while nums or carry: tot = carry # 遍历所有数字,取当前最低位相加 for i in range(len(nums)): if nums[i] > 0: tot += nums[i] % base # 去掉已经处理过的最低位,保留高位 nums[i] = nums[i] // base # 计算当前位值和新的进位 carry = tot // base current_digit = tot % base s = str(current_digit) + s # 移除已经处理完所有位的数字,减少后续循环的计算量 nums = [num for num in nums if num > 0] return s # 测试用例:四个二进制数相加 print(sum_base(2, 1111,1111,11111,10111)) # 输出结果:111110
验证说明
测试用例对应的数值计算:二进制的1111、1111、11111、10111分别对应十进制的15、15、31、23,求和结果为84,84转二进制结果为111110,和代码输出完全一致。该实现支持2~10范围内任意进制的多数字求和需求,逐位计算的逻辑也避免了先转十进制再转目标进制的大数溢出问题。
内容的提问来源于stack exchange,提问作者Yasaman Shokri
相关产品推荐
相关产品推荐

