码迷,mamicode.com
首页 > 其他好文 > 详细

大数乘法

时间:2015-10-31 14:17:01      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

分治算法首先讲了一个经典的乘法运算

具体的代码如下:  该算法的核心是计算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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!