基于 Python 2.7 中的基数求和
sum based on radix in Python 2.7
正在解决计算任何基数(2 到 10 之间的基数,包括端值)的总和的问题,例如“10”+“20”基于 10 的基数结果为 30,而“10”+“20”基于基数 3 结果为 100.
我 post 我的代码和测试用例来验证它是否有效,我的问题是是否有任何性能改进或任何使代码更优雅的想法(我在下面的实现中有一些重复的代码)?谢谢
顺便说一句,如果代码有任何问题,请随时指出。
def radixSum(x, y, radix):
if not x:
return y
if not y:
return x
# make x longer than y
if (len(y) > len(x)):
tmp = x
x = y
y = tmp
lenCommon = min(len(x), len(y))
count = 0
remaining = 0
i = -1
result=''
# deal with common part
while count < lenCommon:
value = int(x[i]) + int(y[i]) + remaining
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
result = str(value) + result
count += 1
i -= 1
# deal with longer string part
while count < len(x):
value = int(x[i]) + remaining
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
result = str(value) + result
count += 1
i -= 1
if remaining > 0:
result = str(remaining) + result
return result
if __name__ == "__main__":
print radixSum("10", "10", 2) #100
print radixSum("10", "20", 10) #30
print radixSum("10", "20", 3) #100
print radixSum("100", "20", 10) #120
你的代码大部分没问题,但是你重复了一些不必要的测试。而不是
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
你可以做到
if value >= radix:
remaining = 1
value = value - radix
else:
remaining = 0
您可以进行的另一项更改是用零填充短数字,这样您就不必担心处理较长数字中的额外数字。
FWIW,这是一个更紧凑的版本。它使用 itertools.izip_longest
来简化添加相应数字并用零填充较短数字的过程。我还更改了函数名称,使其符合 PEP-8 风格指南。
from itertools import izip_longest
def radix_sum(x, y, radix):
#add corresponding digits
a = [int(u) + int(v) for u, v in izip_longest(x[::-1], y[::-1], fillvalue=0)]
# normalize
result = []
carry = 0
for u in a:
carry, u = divmod(u + carry, radix)
result.append(str(u))
if carry:
result.append(str(carry))
return ''.join(result)[::-1]
if __name__ == "__main__":
print radix_sum("10", "10", 2) #100
print radix_sum("10", "20", 10) #30
print radix_sum("10", "20", 3) #100
print radix_sum("100", "20", 10) #120
输出
100
30
100
120
正在解决计算任何基数(2 到 10 之间的基数,包括端值)的总和的问题,例如“10”+“20”基于 10 的基数结果为 30,而“10”+“20”基于基数 3 结果为 100.
我 post 我的代码和测试用例来验证它是否有效,我的问题是是否有任何性能改进或任何使代码更优雅的想法(我在下面的实现中有一些重复的代码)?谢谢
顺便说一句,如果代码有任何问题,请随时指出。
def radixSum(x, y, radix):
if not x:
return y
if not y:
return x
# make x longer than y
if (len(y) > len(x)):
tmp = x
x = y
y = tmp
lenCommon = min(len(x), len(y))
count = 0
remaining = 0
i = -1
result=''
# deal with common part
while count < lenCommon:
value = int(x[i]) + int(y[i]) + remaining
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
result = str(value) + result
count += 1
i -= 1
# deal with longer string part
while count < len(x):
value = int(x[i]) + remaining
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
result = str(value) + result
count += 1
i -= 1
if remaining > 0:
result = str(remaining) + result
return result
if __name__ == "__main__":
print radixSum("10", "10", 2) #100
print radixSum("10", "20", 10) #30
print radixSum("10", "20", 3) #100
print radixSum("100", "20", 10) #120
你的代码大部分没问题,但是你重复了一些不必要的测试。而不是
if value >= radix:
remaining = 1
else:
remaining = 0
if value >= radix:
value = value - radix
你可以做到
if value >= radix:
remaining = 1
value = value - radix
else:
remaining = 0
您可以进行的另一项更改是用零填充短数字,这样您就不必担心处理较长数字中的额外数字。
FWIW,这是一个更紧凑的版本。它使用 itertools.izip_longest
来简化添加相应数字并用零填充较短数字的过程。我还更改了函数名称,使其符合 PEP-8 风格指南。
from itertools import izip_longest
def radix_sum(x, y, radix):
#add corresponding digits
a = [int(u) + int(v) for u, v in izip_longest(x[::-1], y[::-1], fillvalue=0)]
# normalize
result = []
carry = 0
for u in a:
carry, u = divmod(u + carry, radix)
result.append(str(u))
if carry:
result.append(str(carry))
return ''.join(result)[::-1]
if __name__ == "__main__":
print radix_sum("10", "10", 2) #100
print radix_sum("10", "20", 10) #30
print radix_sum("10", "20", 3) #100
print radix_sum("100", "20", 10) #120
输出
100
30
100
120