大數相乘(C語言,分治演算法)

2021-09-01 00:16:39 字數 2014 閱讀 1476

問題:

由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘三種方法。

下面就是用分治演算法解決「大數相乘」問題。

分治演算法解題的一般步驟:

#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位數,就可以直接相乘計算,保證不會溢位。在程式設計中,還需要用的加法和減法,也要通...