python2.7中基于基数的求和

2024-09-30 22:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

计算任意基数(基数在2到10之间,包括2到10)的和的问题,例如“10”+“20”基于10基数的结果是30,而“10”+“20”基于基数3的结果是100。你知道吗

我发布了我的代码和测试用例来验证它的工作,我的问题是是否有任何性能改进或使代码更优雅的想法(我在下面的实现中有一些重复的代码)?谢谢。你知道吗

顺便说一句,如果代码有任何问题,请随时指出。你知道吗

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

Tags: 代码lenreturnifvaluecountnotresult
1条回答
网友
1楼 · 发布于 2024-09-30 22:26:38

您的代码基本上是正常的,但是您不必要地重复一些测试。而不是

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

相关问题 更多 >