分治算法之大整数相乘
代码
#include<iostream>
#include<cmath>
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;
}
思路
其实大整数相乘的核心思路就是
但是时间复杂度没有降低
因此我们去除一个乘法
XY=AC2n+[(A-B)(D-C)+AC+BD]2n/2+BD
此时的时间复杂度为O(nlog3)

浙公网安备 33010602011771号