大整数乘法--分治法

import sys
def add(n1, n2):   #字符串加法
    n1 = n1[::-1]
    n2 = n2[::-1]
    # 补齐到和的最大位数(相加后可能在最后进一位,所以末尾补一个0)
    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  #carry 是进位值
        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',5]分别表示分解后的乘数,后面补0的数量 (12343500000)
    len1,len2 = len(x1[0]),len(x2[0])
    if len1 > 10:
        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 > 10:
        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.split()
        print(muti([n1,0], [n2,0]))

举例说明

123456789 * 678987654

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值