簡體   English   中英

Karatsuba算法的自己實現

[英]Own implementation of Karatsuba algorithm

大家好,我正在嘗試提出自己的 Karatsuba 乘法算法實現,其中當一個數字是單個數字時,基本情況是微不足道的乘法。 我的代碼似乎無法產生正確的答案,我相信這與 z1 的計算方式有關,但我無法弄清楚,請幫助我。

import math
x = input()
y = input()

def suba(x,y):
    if len(x) == 1 or len(y) == 1:
        x = int(x)
        y = int(y)
        return x*y
    else:
        n = int(math.ceil((min(len(x),len(y)))/2))
        h1 = x[0:n]
        l1 = x[n:len(x)]
        h2 = y[0:n]
        l2 = y[n:len(y)]
        z0 = suba(l1,l2)
        z1 = suba(str(int(l1)+int(h1)),str(int(l2)+int(h2)))
        z2 = suba(h1,h2)
        return (z2*10**(n*2))+((z1-z2-z0)*10**(n))+z0

print(suba(x,y))

問題在於分裂。 您需要以這樣的方式拆分(右)部分的大小為n 這是必要的,因為xy部分必須是可比較的:它們必須是通過除以 10 的相同冪來提取的。

所以將拆分代碼更改為:

    h1 = x[:-n]
    l1 = x[-n:]
    h2 = y[:-n]
    l2 = y[-n:]

另請注意,不必為范圍的開頭指定 0,也不必為范圍的結尾指定長度,因為這些是默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM