2009-10-09 87 views
6

Tôi đang cố tính 2^1000 (2 đến 1000) bằng C#. Tôi cần giá trị cho tất cả các địa điểm. Tôi đã gãi đầu của tôi trong một thời bây giờ bởi vì tôi dường như không thể tìm ra cách để đạt được điều này trong C#.Tính số nguyên rất lớn

Có loại loại nào sẽ lưu trữ số lượng dài hơn 300 chữ số mà tôi đang thiếu không? :)

Cảm ơn

+4

Bạn đang làm việc về các vấn đề Euler? Các hit có thể là bạn không cần toàn bộ vaule của 2^1000. Chỉ cần ghi lại những gì hữu ích (ví dụ 20 chữ số thấp hơn) – pierrotlefou

+0

@pierr, vâng, đây là vấn đề của Euler! Tôi đã cần tất cả các chữ số cho vấn đề này, tuy nhiên. – Mike

+1

Tôi đã không làm việc thông qua nhiều dự án Euler, nhưng từ những gì tôi đã nhìn thấy, có vẻ như để yêu cầu các nhiệm vụ lớn như thế này về mục đích, vì vậy bạn phải tìm một phím tắt để giải pháp. Nhưng có, bất kỳ thư viện "chính xác tùy ý" nào và/hoặc "số nguyên lớn" đều phải xử lý điều này cho bạn. –

Trả lời

18

Có, nhưng chỉ trong .NET 4.0 - System.Numerics.BigInteger.

Nếu bạn có thể sử dụng .NET 4.0, tôi sẽ thực hiện việc đó. Nếu không, tôi chắc chắn có thư viện của bên thứ ba xung quanh. Hãy cho tôi biết nếu bạn muốn tôi cố gắng tìm một số.

+0

Tôi sẽ xem liệu có thể sử dụng .NET 4.0 không. Sẽ nhiều hơn là một thư viện. Nếu nó đủ dễ dàng? – Mike

+0

Dường như nhiều người khác đã đăng liên kết tới các thư viện ngay bây giờ :) –

+0

Họ đã đợi cho đến phiên bản 4.0 của khuôn khổ để bao gồm điều đó ??? trong Java nó có kể từ JDK1.1 xD – fortran

4

System.Numerics.BigInteger nếu bạn đang ở trong .net 4.0 (VS 2010)

Hoặc, hãy tìm một tốt bigint thực hiện trên web - có rất nhiều để lựa chọn.

Xem thêm this StackOverflow question.

1

Bạn có thể sử dụng một mảng để lưu trữ các chữ số của mình. Đó là lộn xộn Tôi biết, nhưng về cơ bản bạn sẽ phải lập trình nhân như bạn sẽ làm điều đó bằng tay, ngoại trừ trong mã của bạn.

0

Có một lớp học ở đây gọi BigInt

Rất hữu ích cho loại vấn đề mà không Net 4,0

1

Bạn chỉ có thể sử dụng F # để kiểm tra làm điều đó, vì điều đó sẽ làm việc trong VS2008, nhưng đối với một ứng dụng sản xuất nó sẽ là một vấn đề.

Nhìn vào vấn đề # 25, http://blogs.msdn.com/mpeck/archive/2009/04/01/solving-problems-in-c-and-f-part-2.aspx, vì nó sẽ hiển thị một cách tiếp cận mà bạn có thể sử dụng.

Ứng dụng C# của bạn có thể gọi là lớp F #, chúng hoạt động cùng nhau.

0

eh ..., 2^0 là bit thứ nhất, 2^1 là bit thứ 2, ..., 2^4 là bit thứ 5 .... bạn cần 1000 bit cho điều này. Tôi không biết bất cứ điều gì về C#, tuy nhiên, làm thế nào về chỉ cần nhớ rằng các ký hiệu bitwise là 999 0 với một 1? Và sử dụng nó cho phù hợp.

Bạn định sử dụng số đó để làm gì?

1

Nếu bạn có thể sử dụng IronRuby (không chắc chắn về khả năng sử dụng hiện tại), nó đã chuyển đổi ngầm sang Bignum. Ví dụ:

2 ** 1000 cho: 107150860718626732094842504906000181056140...

+0

Haha StackOverflow chỉ để cho con số đi ra khỏi trang. Ít nhất, đó là những gì nó trông giống như trên trình duyệt của tôi (FF 3.5) – AlbertoPL

+0

Vâng, xin lỗi về điều đó. Sẽ cắt ngắn. –

0

Bạn có thể thêm một tham chiếu đến thời gian chạy Java (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ vjslib.dll là những gì tôi đã có) và using java.math, bạn nhận được BigInteger

+3

Bây giờ anh ta có hai vấn đề, giải quyết vấn đề và tích hợp hai khung công tác – Rodrigo

+0

Bạn không thực sự phải đối phó với nhiều java, nó chỉ là một lớp. Nó hoạt động giống như tất cả các lớp BigInteger khác. –

7

Nếu mục tiêu của bạn là thực hiện các kỹ năng C# về vấn đề Euler, thì việc sử dụng thư viện BigInt có vẻ vô nghĩa. Nếu bạn chỉ cần giá trị của 2^1000 là một bước để giải quyết một vấn đề khác, tốt, ở đây nó được.

10715086071862673209484250490600018105614048117055 
33607443750388370351051124936122493198378815695858 
12759467291755314682518714528569231404359845775746 
98574803934567774824230985421074605062371141877954 
18215304647498358194126739876755916554394607706291 
4571196477686542167660429831652624386837205668069376 
1

Tôi biết câu hỏi này khá cũ nhưng vẫn được tìm thấy bởi google. Tôi đã có cùng một vấn đề, tôi đã tìm kiếm một thư viện để tính toán với số lượng lớn (hoặc nhỏ) mà không thể được đại diện bởi các loại dữ liệu tiêu chuẩn.

Vì vậy, tôi đã tạo loại dữ liệu mới được gọi là EDecimal. Với loại dữ liệu này, bạn có thể tính toán với số lượng kích thước tùy ý và độ chính xác. Nó không quan trọng nếu số có 10 chữ số hoặc 1000000.

Chỉ cần có một cái nhìn vào nó tại https://github.com/anakonda3000/HyperMath/

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