2012-04-24 76 views
7

Làm cách nào để triển khai mã python này trong C#?Các số nguyên lớn tùy ý trong C#

mã Python:

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

Kết quả:

305802052421002911840647389720929531201 

Nhưng trong C# Tôi có vấn đề với con số lớn.

Bạn có thể giúp tôi không?

Tôi có các kết quả khác nhau trong python và C#. Trường hợp có thể là sai lầm?

Trả lời

2

Nếu bạn chỉ muốn có thể sử dụng số lớn hơn, có BigInteger có nhiều chữ số.

18

Loại nguyên thủy (chẳng hạn như Int32, Int64) có độ dài hữu hạn là không đủ cho số lượng lớn như vậy. Ví dụ:

 
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 

Trong trường hợp này đại diện cho số đó bạn cần 128 bit. Với .NET Framework 4.0, có một kiểu dữ liệu mới cho số nguyên có kích thước tùy ý System.Numerics.BigInteger. Bạn không cần chỉ định bất kỳ kích thước nào vì nó sẽ là phỏng đoán theo chính số đó (điều đó có nghĩa là bạn thậm chí có thể nhận được số OutOfMemoryException khi bạn thực hiện, ví dụ: nhân hai số rất lớn).

Để trở lại câu hỏi của bạn, đầu tiên phân tích số thập lục phân của bạn:

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

Sau đó chỉ cần in nó để an ủi:

Console.WriteLine(bigNumber.ToString()); 

Bạn có thể quan tâm để tính toán bao nhiêu bit bạn cần đại diện cho một số tùy ý, sử dụng chức năng này (nếu tôi nhớ thực hiện ban đầu tốt đến từ C Numerical Recipes):

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

    return neededBits; 
} 

Sau đó, để tính toán kích thước yêu cầu của một số được viết dưới dạng chuỗi:

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

Cảm ơn bạn! Nó hoạt động! Nhưng trả về kết quả sai, đó là câu hỏi về thời gian. có lẽ ... =) – pic0

Các vấn đề liên quan