2014-05-05 33 views
1

我正在爲JavaScript做一個數學庫,只是我希望能夠以字符串格式添加大數字,因爲JavaScript中的浮點不能永久保存,您只能添加達到最大值。所以我想在字符串使得數字,然後用手工計算它們像:算術創建JavaScript數學庫

2524618239759212479135012 + 128590322830498023412234 = 2653208562589710502547246

在JS:2524618239759212479135012 + 128590322830498023412234 = 2.6532085625897103e+24

所以我想這樣做是這樣的:

function Add(strA, strB) { 
    // How am I going to calculate it? 
} 

"2524618239759212479135012" + "128590322830498023412234" = "2524618239759212479135012128590322830498023412234"哪一個肯定不行,我想用算法來做到這一點,使用數組或字符串?

我知道簡單的如何把他們像:

22 
+ 23 
--- 
    55 

但我應該如何去實現一個進入我的代碼?

+0

爲什麼不使用現有的庫之一?如果你只是爲了教育目的而這樣做,你應該向我們展示你的嘗試。 – Bergi

+0

因爲我爲了好玩而想要知道我的代碼是如何工作的。 – super

+0

然後將字符串分爲4位或6位數字的塊(假設您還需要進行乘法運算),將塊轉換爲數字並對所得數字的數組執行操作。規範化結果,即執行進位操作,並轉換回字符串。 – LutzL

回答

1

從一些測試開始。

您需要將一些大數乘法和除以爲您的大整數庫創建一些測試用例。這樣做的過程將會是查看代碼如何處理數字的良好開端。

考慮乘法:

23 
x 45 
---- 
115 
+920 
---- 
1035 

本質上我們是分裂繁殖成3 * 45 + 20 * 45。但我們可以進一步將其變成3 * 5 + 20 * 5 + 3 * 40 + 20 * 40。這樣會更像一個向量的點積:

| 3| | 5| 
|20| . |40| 

的一點是,你可以分解給定操作成一系列小規模的行動,其結果您結合以達到最終值。

我會選擇數字而不是字符串值,因爲字符串很慢並且不明確(「0」==「00」...),您需要將其轉換爲行中的某個數字。考慮從一系列浮點數構造每個數字;指數將保存比例信息,尾數保存該數字。因此,3 + 20的等價物是3e0 + 2e1。在二進制中,23是10111,可以是1e111 + 111e0(1x2^5 + 7x2^0)。在JavaScript中,所有數字都保持爲IEEE-754雙精度浮點數,因此您有52位尾數和11位指數。

考慮將您的大整數重寫爲二進制,並將其中的24位放入每個浮點;因爲最大的24位整數是2^23,所以你可以將(2^23)^ 2放入一個浮點數(需要46位)。這將允許您一次執行24位乘法,並且每次乘法的結果將保證適合浮點變量。然後,您可以執行所有進位操作(52-46 = 6位,=> 2^5 = 1024)。一個大整數的存儲將只是一個數組的數組,你可以做很多事情的增加和乘法。

要理解如何進行除法,請編寫大整數除法的單元測試,這應該是有益的。

+0

我終於設法做減法,加法和乘法,把它們放在紙上,爲「0」==「00」我有一個截斷函數也修正字符串以完全相同的方式JavaScript將修復一個數字例如:.340 - > 0.34 – super

+0

我認爲字符串很容易理解,現在對於xD – super