Divide Conquer Combine
分治法的基本思想是将将一个问题分解成若干个规模更小的子问题,然后依据子问题的解得到原问题的解
这个需要递归解决问题,递归解决的子问题一定要与原问题的结构形式保持一直,如果不能一致,需要变成一致
递归函数传递的参数不能是常数
归并算法和快排都是分治
两个n位数的乘积也能分治,将两个n位数从中间分开,高位即有一个加权
这样两个数分解成4个n/2位的数,如果分开相乘则变成了四个子问题,由主定理可知时间复杂度仍然是n的平方
我们要减少子问题的数目,才能减小时间复杂度
这里有个小学的数学问题
x=x02^k+x1
y=y02^k+y1
xy=x1y1+x0y022k+2k(x1y0+x0y1)
x0y1+x1y0=(x1+x0)(y1+y0)-x1y1-x0y0
(x1+x0)*(y1+y0)是没有含义的



#include<stdio.h>
int bit(int x)
{
int b = 0;
while (x > 0) {
x = x >> 1;
b++;
}
return b;
}
int Multiplication(int a,int b)
{
if (a == 0 || b == 0)return 0;
if (bit(b) == 1)return a;
if (bit(a) == 1)return b;
int n = bit(a);
int n1 = n / 2;
int a1 = a >> n1, a2 = a - (a1 << n1);
int b1 = b >> n1, b2 = b - (b1 << n1);
int p = Multiplication(a1 + a2, b1 + b2);
int a1b1 = Multiplication(a1, b1);
int a2b2 = Multiplication(a2, b2);
return((a1b1 << n1 * 2) + (p - a1b1 - a2b2 << n1) + a2b2);
}
int main()
{
int x=10248, y=1023;
printf("%d", Multiplication(x, y));
}

浙公网安备 33010602011771号