标签:
分治算法首先讲了一个经典的乘法运算
具体的代码如下: 该算法的核心是计算xy=(10^n/2xl+xr)(10^n/2yl+yr)=10^nxlyl+10^n/2(xlyr+xryl)+xryr
1 /************************************************************************/ 2 //函数功能:分治法求两个位数为N的整数的乘积 3 //输入参数:X,Y分别为两个位数为N的整数 4 //算法思想:分治算法,xy=(10n/2xl+xr)(10n/2yl+yr)=10nxlyl+10n/2(xlyr+xryl)+xryr 5 //时间复杂度为:T(n)=O(nlog3)=O(n1.59) 6 /************************************************************************/ 7 #include <iostream> 8 #include <cmath> 9 using namespace std; 10 #define SIGN(A) ((A > 0) ? 1 : -1) 11 12 int IntegerMultiply(int X, int Y, int N) 13 { 14 int sign = SIGN(X) * SIGN(Y); //确定结果的符号 15 int x = abs(X); //取绝对值,去掉x,y符号 16 int y = abs(Y); 17 if((0 == x) || (0 == y)) 18 return 0; 19 if (1 == N) 20 return x*y; 21 else 22 { 23 int XL = x / (int)pow(10., (int)N/2); 24 int XR = x - XL * (int)pow(10., N/2); 25 int YL = y / (int)pow(10., (int)N/2); 26 int YR = y - YL * (int)pow(10., N/2); 27 28 int XLYL = IntegerMultiply(XL, YL, N/2); 29 int XRYR = IntegerMultiply(XR, YR, N/2); 30 int XLYRXRYL = IntegerMultiply(XL - XR, YR - YL, N/2) + XLYL + XRYR; 31 return sign * (XLYL * (int)pow(10., N) + XLYRXRYL * (int)pow(10., N/2) + XRYR); 32 } 33 } 34 35 int main() 36 { 37 int x = 1234; 38 int y = 4321; 39 cout<<"x * y = "<<IntegerMultiply(x, y, 4)<<endl; 40 cout<<"x * y = "<<x*y<<endl; 41 return 0; 42 }
标签:
原文地址:http://www.cnblogs.com/liugl7/p/4925467.html