2016-09-22 95 views
1

處理計算任何基數(基數在2到10之間,包括2和10之間)的和的問題,例如基於10基數的「10」+「20」導致30,以及「10 「+」20「基於基數3導致100.基於Python中基數的總和2.7

我發佈我的代碼和測試用例來驗證它的工作原理,我的問題是如果有任何性能改進或任何想法使代碼更優雅(我有一些重複代碼在我下面的實現)?謝謝。

順便說一句,如果代碼有任何問題,請隨時指出。

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 
+1

我投票關閉這一問題作爲題外話,因爲它是「工作規範」,屬於對http://codereview.stackexchange.com –

+1

基數20數字包括字母和數字,如「3f」 – Andomar

+1

@Andomar:是的,但我們不必擔心:「(基數在2到10之間,包括2和10)」。 –

回答

1

你的代碼基本沒問題,但是你不必要地重複一些測試。取而代之的

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 
+0

非常聰明,謝謝下午,投票並將您的答覆標記爲答案。 –