大整数乘法(分治法)
题目描述:设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/