Python 为什么这个代码在karatsuba乘法中返回负的答案

Python 为什么这个代码在karatsuba乘法中返回负的答案,python,karatsuba,Python,Karatsuba,python不应该有任何溢出问题。那么当输入很大时,为什么返回负的答案呢 我检查了一下,发现问题不在Python溢出中。和k或n相比,您在上一次迭代中的o值要大得多。 k和n都得到了值6,而o包含17487400。所以n-k-o导致了负面结果。查看原始算法,您的代码应该是 """karatsuba algo""" def fast(x,y): if len(str(x))==1 or len(str(y))==1: return x*y else:

python不应该有任何溢出问题。那么当输入很大时,为什么返回负的答案呢

我检查了一下,发现问题不在Python溢出中。和k或n相比,您在上一次迭代中的o值要大得多。
k和n都得到了值6,而o包含17487400。所以n-k-o导致了负面结果。

查看原始算法,您的代码应该是

    """karatsuba algo"""
def fast(x,y):
    if len(str(x))==1 or len(str(y))==1:
        return x*y
    else:
        n = max(len(str(x)),len(str(y)))
        m = n//2

        a = x//10**m
        b = x%10**m
        c = y//10**m
        d = y%10**m

        k = fast(a,c)
        n = fast((a+b),(c+d))
        o = fast(b,d)

        return (10**2*m*k) +(10**m*(n-k-o))+(o)
print(fast(10515610,5651551460))
请看2*m左右的附加括号。否则你会乘以m,而不是提升到幂


通过使用新变量替换所有10**m位,您可能会使其更具可读性和效率。事实并非如此。如果您尝试PrintFast10515996105651460,您将得到441780299400,因此是操作导致了它。对于正输入,唯一的负数来源是n-k-o。所以,如果你看到一个负面的结果,你会假设在某个点上nreturn (10**(2*m)*k) +(10**m*(n-k-o))+(o)