2009-10-09 25 views
6

Estoy tratando de calcular 2^1000 (2 a la potencia de 1000) usando C#. Necesito el valor para todos los lugares. Me he estado rascando la cabeza por un tiempo ahora porque parece que no puedo encontrar una manera de lograr esto en C#.Cálculo de números enteros muy grandes

¿Hay algún tipo de tipo que almacenará un número de más de 300 dígitos, que me falta? :)

Gracias

+4

¿Estás trabajando en problemas de Euler? El golpe puede ser que no necesitas todo el vaule de 2^1000. Simplemente registre lo que es útil (por ejemplo, los 20 digitales más bajos) – pierrotlefou

+0

@pierr, sí, esto fue para un problema de Euler en realidad. Sin embargo, necesitaba todos los dígitos para este problema. – Mike

+1

No he trabajado mucho en Project Euler, pero por lo que he visto, parece pedir grandes tareas como esta a propósito, por lo que debe encontrar un acceso directo a la solución. Pero sí, cualquier biblioteca de "precisión arbitraria" y/o "gran número entero" debería manejar esto por usted. –

Respuesta

18

Sí, pero sólo en .NET 4,0-System.Numerics.BigInteger.

Si puede usar .NET 4.0, yo iría por eso. De lo contrario, estoy seguro de que hay bibliotecas de terceros. Avísame si quieres que intente encontrar alguno.

+0

Voy a ver si es posible usar .NET 4.0. Preferiría mucho más que una biblioteca. Si es lo suficientemente fácil? – Mike

+0

Parece que muchas otras personas han publicado enlaces a bibliotecas ahora :) –

+0

Han esperado hasta la versión 4.0 del framework para incluir eso ??? en Java está allí desde JDK1.1 xD – fortran

4

System.Numerics.BigInteger si estás en .NET 4.0 (VS 2010)

O bien, buscar un buen bigint aplicación en la web - Hay muchos para elegir.

Véase también this StackOverflow question.

1

Puede usar una matriz para almacenar sus dígitos. Es desordenado, lo sé, pero esencialmente tendrás que programar la multiplicación como lo harías a mano, excepto en tu código.

0

hay una clase llamada aquí BigInt

Muy útil para ese tipo de problema sin .Net 4.0

0

eh ..., 2^0 es 1er bit, 2^1 es 2do bit, ..., 2^4 es 5to bit ... necesitas 1000 bits para esto. No sé nada de C#, sin embargo, ¿qué tal si recordamos que la notación bit a bit es un 999 0 con un 1? Y úsala en consecuencia.

¿Para qué planea usar ese número?

1

Si puede usar IronRuby (no estoy seguro de qué tan útil es en este momento), tiene una conversión implícita a Bignum. Ejemplo:

2 ** 1000 da: 107150860718626732094842504906000181056140...

+0

Haha StackOverflow simplemente deja que el número salga de la página. Al menos, eso es lo que parece en mi navegador (FF 3.5) – AlbertoPL

+0

Sí, lo siento. Truncaré –

0

Usted puede agregar una referencia al tiempo de ejecución de Java (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ vjslib.dll es lo que tengo) y using java.math, obtienes un BigInteger

+3

Ahora tiene dos problemas, resuelve el problema e integra dos marcos – Rodrigo

+0

No tienes que ocuparte de gran parte de Java, es solo una clase. Funciona tan bien como todas las demás clases de BigInteger. –

7

Si tu objetivo es ejercitar tus habilidades de C# en problemas de Euler, entonces usar una biblioteca BigInt parece inútil. Si solo necesitas el valor de 2^1000 como paso para resolver otro problema, bueno, aquí está.

10715086071862673209484250490600018105614048117055 
33607443750388370351051124936122493198378815695858 
12759467291755314682518714528569231404359845775746 
98574803934567774824230985421074605062371141877954 
18215304647498358194126739876755916554394607706291 
4571196477686542167660429831652624386837205668069376 
1

Sé que esta pregunta es bastante antigua, pero todavía la encuentra Google. Tuve el mismo problema, estaba buscando una biblioteca para calcular números enormes (o pequeños) que no pueden ser representados por tipos de datos estándar.

Así que creé un nuevo tipo de datos llamado EDecimal. Con este tipo de datos puede calcular con números de tamaño y precisión arbitrarios. No importa si el número tiene 10 dígitos o 1000000.

Sólo echar un vistazo a él en https://github.com/anakonda3000/HyperMath/