2009-04-24 19 views
2

我有一個非常大的數字,我需要計算,並且C#中的內置數據類型都不能處理如此大的數字。在C#中的高精度整數數學?

Basicly欲解決這個問題:

項目歐拉16:

2^15 = 32768和它的數字 的總和爲3 + 2 + 7 + 6 + 8 = 26.

number 2^1000的數字之和是多少?

我已經編寫了代碼,但是,如前所述,數字對於c#數據類型來說太大了。代碼已經過測試並通過小數字驗證(例如2^15),並且工作正常。

using System; 

namespace _16_2E1000 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ulong sum = 0; 
      ulong i = 1 << 1000; 
      string s = i.ToString(); 
      foreach (char c in s) 
      { 
       sum += (ulong) Convert.ToInt64(c.ToString()); 
      } 
      Console.WriteLine(sum); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

啊,謝謝你糾正題目。我知道我已經關閉了。 – CasperT 2009-04-24 22:38:29

回答

3

先回答者你確切的問題,尋找一個BigIntBigNum

其次,從我所知道的項目歐拉的,就會有一個很酷的,棘手的方式做到這一點,但更易於。

作爲第一個猜測,我會計算2^1 - > 2^n的回答者(無論你可以上班),並尋找模式。也可以在序列中查找模式

V(0) = 2^p 

V(n) = floor(V(n - 1)/10) 
D(n) = V(n) % 10 
+0

目前,.NET Framework中沒有內置BigInteger類型,但有一些可用的實現(例如在DLR中)。但是,是的,你的第二點顯然是問題的真正點! – itowlson 2009-04-24 22:21:39

+0

你能指導我做一個漂亮的實現嗎? :) 添加數百行代碼來解決這個問題似乎很愚蠢。 此外,很高興知道如何創建BigInt,以便我可以在未來的其他情況下使用它。 – CasperT 2009-04-24 22:26:43

3

沒有必要爲了解決這個問題Big Integer能力。

人們可以只使用屬性,

2^n = 2^(n-1) + 2^(n-1) 

如果大整數是其他任務真的有必要,我一直在使用從F#的BigInt有類在我的C#程序過得快樂它。

必要的步驟

  1. 安裝F# CTP

  2. 在你的C#(或其他.NET語言)應用程序添加到FSharp.Core DLL的引用。

  3. 加:U sing Microsoft.FSharp.Math;

  4. 在「類視圖」窗口熟悉兩個班的成員:BigIntBigNum

執行這些步驟後一個基本準備使用BigInt類。

最後一個提示

爲了避免聲明變量與不正確的名稱來保存常量使代碼不可讀,我使用的是與_(下劃線)開頭的名稱,其次是整型常量。在這樣一個會像表達式:

N = _2 * N; 

比顯然更可讀:

N = Two * N; 
0

這裏有一個BigInteger(源代碼可用),您可以使用;不過,正如已經提到的那樣,這樣做比蠻力更有效。

BigInteger on codeplex

0

事實上,而BigInteger的效用可能會感興趣這裏,你不需要它,即使是這一點。是的,它看起來像是,但你不知道。事實上,使用biginteger表格甚至可能會減慢速度。

因爲我不想爲你解決問題,我只是建議你以模塊化的方式考慮這個問題。