問題:
由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘三種方法。
下面就是用分治演算法解決「大數相乘」問題。
分治演算法解題的一般步驟:
#include
using
namespace std;
#include
#define maxsize 1000
int*result;
//定義全域性整型陣列,存放結果
intmultipy
(char
*a,int ai,
int aj,
char
*b,int bi,
int bj,
int move)
int m =
(ai+aj)/2
;int n =
(bi+bj)/2
;int s = aj - m;
int k = bj - n;
multipy
(a,ai,m,b,bi,n,s+k+move)
;//對問題的分解
multipy
(a,m+
1,aj,b,n+
1,bj,move)
;multipy
(a,m+
1,aj,b,bi,n,k+move)
;multipy
(a,ai,m,b,n+
1,bj,s+move);}
intarrange
(int
*a)else
i++;}
}int
main()
if(b[0]
=='-')
result =
newint
(len+1)
;for
(int i =
0; i <= len-
1; i++
) result[len]
=10000
;//給result陣列多一位存放特殊數(大於四位數的都可以)
if(a[0]
=='-'
&&b[0]
=='-'
)multipy
(a,1
,a_len-
1,b,
1,b_len-1,
0);else
if(a[0]
=='-'
&&b[0]
!='-'
)multipy
(a,1
,a_len-
1,b,
0,b_len-1,
0);else
if(a[0]
!='-'
&&b[0]
!='-'
)multipy
(a,0
,a_len-
1,b,
0,b_len-1,
0);else
multipy
(a,0
,a_len-
1,b,
1,b_len-1,
0);arrange
(result)
;int end = len-1;
while
(result[end]==0
)if(minus ==
1)cout<<
'-';
for(
int i = end; i >=
0; i--)if
(end ==-1
)cout<<
"0";
//這是結果為0的情況,以免沒有輸出
cout
}}
參考資料:
《演算法學習與應用 從入門到精通》張玲玲
【演算法】大數乘法問題及其高效演算法
大數相乘(分治法, c/c++)
分治法 大數相乘(演算法001)
兩個長為n bit的數x和y相乘。我們可以將數分為長為n 2 bit的前後兩部分,分別相乘。x y 2n 2xl xr 2n 2yl yr 2nxlyl 2n 2 xlyr xryl xryr 2nxlyl 2n 2 xl xr yl yr xlyl xryr xryr 公式如上,xl,yl,xr,...
c語言大數相乘
大數相乘的方法很多,在這裡我就介紹乙個理解和寫起來比較方便的 思想和大數相加差不多!為什麼大數相乘相較於大數相加比較難呢?以 n m 位的數為例 假設兩個大數的字元陣列分別為 s1,s2 答案陣列為 a 遍歷是比較簡單的,主要是進製的問題,我們可以先不考慮進製,將 s1 的第 i 位與 s2 的第 ...
分治法實現大數相乘 C 實現
分治法的思路一般的演算法教科書上都有,大數相乘也經常用來作為練習分治思想的很好的例子。具體如下 雖然上面的原理是對應2進製的,但是對於10進製也同樣可行。用c 實現,盡可能的利用c 的特性。本例中,只要拆分的數字小於9位數,就可以直接相乘計算,保證不會溢位。在程式設計中,還需要用的加法和減法,也要通...