Python分治法实现大整数相乘

在这里插入图片描述思路是将大整数(A*B)通过分治法拆分成(A1+A2)B,如果A1数位长度仍然大于某个阈值(以下代码为8位数),则继续拆分。B也一样。
辛辛苦苦写完后,发现题友直接使用python自带运算A
B也能通过,查证得知Python整数大小没有限制。如果用java或者c++实现的话他们的方法肯定是不合格的了。人生苦短,python牛逼。

import sys
def add(n1, n2):
    n1 = n1[::-1]
    n2 = n2[::-1]
    # 补齐到和的最大位数
    if len(n1)<len(n2):
        n2 += '0'
        n1 += '0'*(len(n2)-len(n1))
    else:
        n1 += '0'
        n2 += '0'*(len(n1)-len(n2))
    carry,sum = 0,''
    for i in range(len(n1)):
        cur_sum = int(n1[i]) + int(n2[i]) + carry
        carry = cur_sum // 10
        sum += str(cur_sum % 10)
    sum = sum[::-1]
    # 去掉前面的零
    while len(sum)>1 and sum[0]=='0':
        sum = sum[1:]
    return sum

def muti(x1, x2):
    # xi = ['123435',10]分别表示分解后乘数,数位
    len1,len2 = len(x1[0]),len(x2[0])
    if len1 > 8:
        cut_point = len1//2
        x1_0 = [x1[0][:cut_point],x1[1]+len1-cut_point]
        x1_1 = [x1[0][cut_point:],x1[1]]
        return add(muti(x1_0, x2),muti(x1_1,x2))
    if len2 > 8:
        cut_point = len2//2
        x2_0 = [x2[0][:cut_point],x2[1]+len2-cut_point]
        x2_1 = [x2[0][cut_point:],x2[1]]
        return add(muti(x1, x2_0),muti(x1,x2_1))    
    val = str(int(x1[0])*int(x2[0]))
    bit = x1[1]+x2[1]
    val += '0'*bit
    return val

if __name__ == "__main__":
    for line in sys.stdin:
        n1,n2 = line.strip().split()
        print(muti([n1,0], [n2,0]))
发布了24 篇原创文章 · 获赞 8 · 访问量 7223

猜你喜欢

转载自blog.csdn.net/geek_hch/article/details/88185904
今日推荐