2012-04-24 5 views
7

Как реализовать этот код python в C#?Произвольно большие целые числа в C#

Python код:

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

Результат:

305802052421002911840647389720929531201 

Но в C# У меня есть проблемы с большими цифрами.

Вы можете мне помочь?

У меня разные результаты в python и C#. Где ошибка?

ответ

2

Если вы просто хотите использовать большие номера, то есть BigInteger, в котором много цифр.

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. Вам не нужно указывать какой-либо размер, потому что это будет inferred самим номером (это означает, что вы можете даже получить OutOfMemoryException, когда вы выполняете, например, умножение двух очень больших чисел).

Чтобы вернуться к вашему вопросу, первый разобрать ваш шестнадцатеричный номер:

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

Затем просто распечатать его на консоль:

Console.WriteLine(bigNumber.ToString()); 

Вы можете быть заинтересованы, чтобы подсчитать, сколько битов вам нужно представляют собой произвольное число, используйте эту функцию (если я хорошо помню, что исходная реализация исходит из C-числовых рецептов):

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