Pregunta

¿Alguien sabe de una manera que puedo calcular números enteros muy grandes en C #

Estoy tratando de calcular el factorial de números por ejemplo.

5! = 5 * 4 * 3 * 2 * 1 = 120

con números pequeños esto no es un problema, pero tratando de calcular el factorial del valor mas grande de un entero sin signo que es 4294967295 no parece posible.

He mirado en la clase BigInteger pero no parece hacer lo que necesito

cualquier ayuda sería muy apreciada

¿Fue útil?

Solución

4294967295! = 10 ^ (10 ^ 10.597) ~ 10 ^ (40000000000) Este valor requiere alrededor de 40 Gb de memoria RAM para almacenar, incluso si se encuentra cualquier aplicación BigInteger para C #!

P.S. Pues bien, con almacenamiento optimizado, digamos 9 dígitos en 4 bytes, que se llevará a ~ 18 Gb de memoria RAM.

Otros consejos

Para calcular el factorial de uint.MaxValue que había necesidad de un mucho de almacenamiento.

Por ejemplo, el artículo de Wikipedia como 8,2639316883 ... x 10 ^ 5.565.708. Usted va a ganar la información como un loco.

muy sospecha que no vas encontrar ninguna manera de calcularlo en un equipo sano en una cantidad sana de tiempo. ¿Por qué necesita este valor? Sería la aproximación de Stirling estar lo suficientemente cerca?

En primer lugar, vale la pena señalar que el factorial de uint.MaxValue es astronómicamente grande. No soy capaz de encontrar una buena estimación del orden de magnitud de su factorial, pero su representación poco probable que ocupará un alto porcentaje de una memoria RAM estándar, si no bien superar.

Una clase BigInteger parece ser lo que quiera, siempre y cuando sólo se quiere ir hasta alrededor de 1.000.000 o menos (muy aproximadamente). Después de eso, el tiempo y la memoria se vuelven muy prohibitivo. En las versiones actuales (estables) de .NET, hasta 3,5, hay que ir con una implementación personalizada. Éste en el CodeProject parece estar altamente clasificado. Si le sucede a ser el desarrollo de .NET 4.0, el equipo de Microsoft finalmente han llegado en torno a la inclusión de un clase BigInteger en el espacio de nombres System.Numerics del BCL. A diferencia de algunas implementaciones BigInteger, la existente en .NET 4.0 no tiene un método factorial incorporado (no estoy seguro sobre el CodeProject uno), pero debería ser trivial para implementar uno - un método de extensión sería un buen camino.

Ya que parece pensar que usted no desea utilizar un tipo BigInteger, sería útil si se pudiera comprobar que no es lo que quiere de haber leído mi respuesta, y luego explicar precisamente por eso no satisface sus propósitos .

¿Por qué cree que es necesario calcular los factoriales? No es útil para practiacally nada que hacer los cálculos reales.

Sólo el resultado del cálculo factorial de (2 ^ 32-1) ocuparía mucho espacio, de aproximadamente 16 GB.

El cálculo en sí, por supuesto, tomar mucho tiempo. Si se construye el programa para que pueda transferir el proceso de cálculo de un hardware más rápido, ya que se inventó, usted debe ser capaz de obtener el resultado dentro de su vida.

Si se trata de algo así como un problema Euler que está tratando de resolver, tenga en cuenta que una gran cantidad de soluciones se encuentran por elliminating qué es lo que en realidad no tiene que calcular con el fin de obtener la respuesta.

Aquí . El más rápido, directamente desde el hombre factorial -. Pedro Luschny

Puede utilizar la clase BigInteger de las bibliotecas J #, por ahora. He aquí un artículo sobre cómo . Se hace más difícil el despliegue porque hay que enviar el J # redistributable . También puede considerar ir a como Framework 4.0 tendrá BigInteger .

En caso de que tenga J # Redist instalado, una forma alternativa sería utilizar java.math.BigInteger añadiendo una referencia al ensamblado vjslib.

Trate de usar una matriz para esta tarea. Se podría utilizar números enteros, siempre y cuando usted tiene un espacio de memoria libre. Cada miembro del array repsesents un dígito decimal. El único que necesita es implementar multipication.

Si usted está haciendo cálculos con los factoriales como combinaciones, por ejemplo, que rara vez se necesita multiplicar hasta el fondo a 1 (por ejemplo. 98 * 98 * 97 ya que todo lo demás anula).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top