2013-02-17 158 views
1

如何在C#中將兩個64位十進制數相乘而不會溢出?兩個64位數的乘法運算

+0

我不認爲你可以存儲一個64位數字在任何現代的CPU完全準確,假設你的意思是十進制數字,而不是二進制數字或別的東西。如果您有兩個64位數字(假設從非零開始),那麼結果將是大約128位數字(10^64 * 10^64 = 10^128)。哎喲。 – Joe 2013-02-17 10:30:48

+1

你應該給出比這更多的信息。他們是整數嗎?這非常重要。數字在什麼基礎上?二進制?十進制?十六進制也許?它很重要。 – harold 2013-02-17 10:32:50

+0

對不起,缺失的信息...兩個號碼。是小數點 – Bright 2013-02-17 10:38:12

回答

3

如果需要64個十進制位數字,如果他們是整數,則可以使用System.Numerics.BigInteger結構(需要​​集的引用)。

BigInteger firstNumber = BigInteger.Parse("63518439492097324687235465876298368764576527346564625480"); 
BigInteger secondNumber = BigInteger.Parse("84890247648975285765484902890273086475254764765147643611"); 
BigInteger product = firstNumber * secondNumber; 
+0

不錯。我正在猜測的一個類實現了我要建議的內容(將數字分成易於管理的數字,並在部分中進行乘法運算) – Joe 2013-02-17 10:34:34

+1

@Joe是的,它將它分解爲無符號的8位數字。它們被保存在一個'byte []'類型的數組中。我不知道給定大小的BigInteger需要多少次CPU乘法(可能取決於編譯模式和運行時根據實際硬件做出的決定)。 – 2013-02-17 10:56:58

0

您總是可以使用decimal來存儲兩個long數字相乘的結果。

long bigNumber = 12345678L; 
long anotherBigNumber = 23456789L; 
decimal result = bigNumber * anotherBigNumber; 
+1

乘法在你的例子中用'long'完成。即使你在乘法之前轉換爲「十進制」,也可能沒有足夠的「空間」。嘗試乘以'1000000000000000L'(十五個零)與相同大小的數字。如果你使用'long'乘法,結果將會「環繞」,如果你使用'decimal'乘法,它會拋出一個異常。 – 2013-02-17 10:44:54

+0

他不會說'long'類型的數字。他要求增加64個編號。 – 2013-02-17 10:45:01

0

我想(只要你想)如果第一,你可以做的任何數量的計算,你轉換成字符串數(所以兩個獨立的字符串)比得到的最後一個數字(字符),並乘以與其他角色的每一個數字(就像你在學校學到的一樣)等等,並且將你的最終得分數字(也作爲字符串)添加到你。我知道這是可以做到的,這將是一開始的王道難題,但是一旦你創建了這個函數,你就可以乘以你想要的任何數字:)

0

如果它們是整數,則使用System.Numerics中的BigInteger類System.Numerics.dll!)

如果沒有,Codeplex中有一個BigRational類。它本意是在System.Numerics中,但它被踢了。鏈接: http://bcl.codeplex.com/releases/view/42782