Divide Conquer Combine

分治法的基本思想是将将一个问题分解成若干个规模更小的子问题,然后依据子问题的解得到原问题的解
这个需要递归解决问题,递归解决的子问题一定要与原问题的结构形式保持一直,如果不能一致,需要变成一致
递归函数传递的参数不能是常数
归并算法和快排都是分治

两个n位数的乘积也能分治,将两个n位数从中间分开,高位即有一个加权
这样两个数分解成4个n/2位的数,如果分开相乘则变成了四个子问题,由主定理可知时间复杂度仍然是n的平方

我们要减少子问题的数目,才能减小时间复杂度

这里有个小学的数学问题
x=x02^k+x1
y=y0
2^k+y1
xy=x1y1+x0y022k+2k(x1y0+x0y1)
x0
y1+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));

}
posted @ 2021-09-25 17:20  empty_thought  阅读(41)  评论(0)    收藏  举报