Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7中基于基数的求和_Python_Python 2.7_Radix - Fatal编程技术网

Python 2.7中基于基数的求和

Python 2.7中基于基数的求和,python,python-2.7,radix,Python,Python 2.7,Radix,处理一个问题来计算任何基数的和(基数介于2到10之间,包括10),例如,基于10个基数的“10”+“20”结果为30,基于基数3的“10”+“20”结果为100 我发布我的代码和测试用例来验证它是否有效,我的问题是,是否有任何性能改进或使代码更优雅的想法(我在下面的实现中有一些重复的代码)?谢谢 顺便说一句,如果代码有任何问题,请随时指出 def radixSum(x, y, radix): if not x: return y if not y:

处理一个问题来计算任何基数的和(基数介于2到10之间,包括10),例如,基于10个基数的“10”+“20”结果为30,基于基数3的“10”+“20”结果为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
def镭(x,y,基数):
如果不是x:
返回y
如果不是y:
返回x
#使x比y长
如果(len(y)>len(x)):
tmp=x
x=y
y=tmp
lenCommon=min(len(x),len(y))
计数=0
剩余=0
i=-1
结果=“”
#处理公共部分
当计数<公共值时:
值=整数(x[i])+整数(y[i])+剩余
如果值>=基数:
剩余=1
其他:
剩余=0
如果值>=基数:
值=值-基数
结果=str(值)+结果
计数+=1
i-=1
#处理较长的字符串部分
当计数小于len(x)时:
值=整数(x[i])+剩余值
如果值>=基数:
剩余=1
其他:
剩余=0
如果值>=基数:
值=值-基数
结果=str(值)+结果
计数+=1
i-=1
如果剩余值>0:
结果=str(剩余)+结果
返回结果
如果名称=“\uuuuu main\uuuuuuuu”:
打印镭(“10”、“10”、2)#100
打印镭(“10”、“20”、10)#30
打印镭(“10”、“20”、3)#100
打印镭(“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

我投票结束这个问题,因为它是“工作代码”,属于基数20,数字包括字母和数字,如“3f”@Andomar:True,但我们不需要担心:“(基数在2到10之间,包括在内)”。非常聪明,谢谢,PM,投票并将您的回答标记为答案。