2013-06-28 94 views
0

在C中,可以執行一個簡單的:你如何計算無限位數的數字?

int a = b + c; 

現在,如果a大於2^32(或也許是2^31 + 1),你的代碼改變爲:

unsigned long a = b + c; 

但你會如何實現加入諸如:

bigint a = b + c; 

其中bigint是用於存儲和計算大整數(數字爲數百位數的數字)的某種類/ typedef /結構。如果您只是想用小學的標準手寫小數方法來將數字加在一起,那麼您可以在方程中做無限長的數字。但是到了計算機科學,你怎麼能使用二進制,有效的方法,你可以做無限長的計算(提供足夠的RAM是可用的)

更何況,有沒有辦法做到這一點不是非常慢?

+2

您使用類似[GMP](http://gmplib.org/)的圖書館。 –

+0

「你如何對無限位數的數字進行計算?」 - 幾乎不。 – 2013-06-28 21:57:39

+1

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries – Barmar

回答

0

你可以使用bigint library,或者如果你真的覺得有雄心壯志,你可以創建一個動態數組來存儲你的整數。

0

有很快的方法來做到這一點(在CPU寄存器中強硬仍然比數學慢,請注意)。這個庫已經存在,但如果你對實現細節感興趣,我會建議檢查GMP的源代碼(http://gmplib.org/),以及閱讀(和在做練習)Knuth的計算機編程的藝術,卷2:Seminumerical Algorithms

0

「更何況,有沒有辦法做到這一點不是非常慢?」

與固定長度,16,32,64相比,在一些128位的機器上,它會很慢,因爲數學必須以小步驟完成。加法和減法並不算太差,陣列中每個單元只有一個或兩個時鐘週期(32或64位,具體取決於體系結構),但乘法和除法確實很慢。隨着數字變得非常大(超過幾千位數),您還會遇到緩存未命中的問題,這會降低計算速度。

但是你當然可以比將數字存儲在ascii字符串中好一點。