分治算法之大整数相乘

代码

#include
#include
using namespace std;

#define sign(a) ((a>0)?1:-1)

int divideConquer(int x,int y,int n)
{
	int sign =sign(x)*sign(y);//判断符号 正负 
	x=abs(x);               
    y=abs(y);
	if(x==0||y==0)
	  return 0;
	if(n==1)
	  return sign*x*y;
	int a=(int)x/pow(10,(int)(n/2));//取x的前半位 
	int b=x-a*pow(10,n/2);
	int c=(int)y/pow(10,(int)(n/2));//取y的前半位 
	int d=y-c*pow(10,n/2);
	int ac=divideConquer(a,c,n/2);//又一次大整数相乘 
	int bd=divideConquer(b,d,n/2);
	int abcd=divideConquer(a-b,d-c,n/2)+ac+bd;
	return sign*(ac*pow(10,n)+abcd*pow(10,(int)n/2)+bd);	
} 

int main()
{
	int x,y,n;
	cin>>x>>y>>n;
	cout<<divideConquer(x,y,n);
	return 0;
}

思路

其实大整数相乘的核心思路就是
分治算法之大整数相乘_第1张图片
但是时间复杂度没有降低
因此我们去除一个乘法
XY=AC2n+[(A-B)(D-C)+AC+BD]2n/2+BD
此时的时间复杂度为O(nlog3)

你可能感兴趣的:(算法)