大整数乘法(分治法)

大整数乘法(分治法)

题目描述:设X和Y都是n位的十进制整数,计算它们的乘积X*Y。

如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果,时间复杂度为O(n2);

因此我们思考,能不能采用分治法来降低时间复杂度。
在这里插入图片描述

我们将X和Y按照上述方式划分,故可得:

**XY = ac×10n + (ad + bc)×10n/2 + bd; **

但是经过分析可以看出,这样处理并没有降低时间复杂度,那么我们是否可以减少乘法计算来降低O?

XY = ac×10n + ((a-b)(d-c) + ac + bd)×10n/2 + bd

XY = ac×10n + ((a+b)(d+c) - ac - bd)×10n/2 + bd

这样以来我们只需要计算三次乘法即可。

但是需要注意一点,事实上因为 n/2为 floor除法,故而 n的奇偶性会导致结果出错,下面附上数学分析:
n / 2 = [ n / 2 ] X = a × 1 0 [ n / 2 ] + B Y = b × 1 0 [ n / 2 ] + C X Y = a b × 1 0 2 × [ n / 2 ] + ( ( a + b ) ( c + d ) − a c − b d ) × 1 0 [ n / 2 ] + b d n/2=[n/2]\\ X=a×10^{[n/2]}+B\\ Y=b×10^{[n/2]}+C\\ XY=ab×10^{2×[n/2]}+((a+b)(c+d)-ac-bd)×10^{[n/2]}+bd n/2=[n/2]X=a×10[n/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值