2012-04-24 64 views
7

如何在c#中實現這個python代碼?C中的任意大整數#

Python代碼:

print(str(int(str("e60f553e42aa44aebf1d6723b0be7541"), 16))) 

結果:

305802052421002911840647389720929531201 

但在C#我有一個很大的數字問題。

你能幫我嗎?

我在python和c#中有不同的結果。哪裏可以出錯?

回答

18

原始類型(如Int32,Int64)具有有限的長度,這對於這樣大的數目是不夠的。例如:

 
Data type          Maximum positive value 
Int32             2,147,483,647 
UInt32             4,294,967,295 
Int64          9,223,372,036,854,775,808 
UInt64         18,446,744,073,709,551,615 
Your number  305,802,052,421,002,911,840,647,389,720,929,531,201 

在這種情況下,表示這個數字,你就需要128位。使用.NET Framework 4.0,可以使用任意大小的整數System.Numerics.BigInteger的新數據類型。您不需要指定任何大小,因爲它將由數字本身推斷爲(這意味着您在執行時可能會得到OutOfMemoryException,例如,兩個非常大的數字相乘)。

要回到你的問題,首先分析您的十六進制數字:

string bigNumberAsText = "e60f553e42aa44aebf1d6723b0be7541"; 
BigInteger bigNumber = BigInteger.Parse(bigNumberAsText, 
    NumberStyles.AllowHexSpecifier); 

然後,只需打印到控制檯:

Console.WriteLine(bigNumber.ToString()); 

你可能有興趣來計算你需要多少位代表任意數字,使用這個函數(如果我記得原來的實現來自C Numerical Recipes):

public static uint GetNeededBitsToRepresentInteger(BigInteger value) 
{ 
    uint neededBits = 0; 
    while (value != 0) 
    { 
     value >>= 1; 
     ++neededBits; 
    } 

    return neededBits; 
} 

然後計算所需字符的大小寫爲:

public static uint GetNeededBitsToRepresentInteger(string value, 
    NumberStyles numberStyle = NumberStyles.None) 
{ 
    return GetNeededBitsToRepresentInteger(
     BigInteger.Parse(value, numberStyle)); 
} 
+0

謝謝!有用!但是返回錯誤的結果,這是時間問題。也許... =) – pic0 2012-04-24 19:11:22