2008-11-10 13 views
21

Estoy tratando de resolver los problemas en projecteuler.net pero sigo encontrándome con un par de problemas.trabajando con números increíblemente grandes en .NET

La primera es una cuestión de almacenar grandes cantidades de elementos en un List<t>. Sigo recibiendo OutOfMemoryException al almacenar grandes cantidades en la lista.

Ahora admito que podría no estar haciendo estas cosas de la mejor manera pero, ¿hay alguna forma de definir cuánta memoria puede consumir la aplicación?

Por lo general, se bloquea nada consigo unos ciento veinte 100.000.000 elementos: S

En segundo lugar, algunas de las preguntas requieren la adición de un número masivo. Utilizo el tipo de datos ulong, donde creo que el número va a ser muy grande, pero aún así me las arreglé para envolver el int más extenso y obtener números negativos.

¿Tiene algún consejo para trabajar con números increíblemente grandes?

+8

En .NET 4.0, System.Numerics.BigInteger se ocupa de grandes cantidades. – Brian

Respuesta

26

Debe usar una clase de número grande que use algunos principios matemáticos básicos para dividir estas operaciones. Este implementation of a C# BigInteger library en CodePoject parece ser el más prometedor. El artículo tiene algunas buenas explicaciones de cómo funcionan las operaciones con números masivos, también.

Véase también: Big integers in C#

+4

¿Por qué fue votado negativamente? O.o – TraumaPony

1

ver las respuestas en este thread. Probablemente necesite usar una de las librerías/clases de enteros grandes de terceros disponibles o espere C# 4.0 que incluirá un tipo de datos BigInteger nativo.

+0

+1 para usar el cuadro de búsqueda (¿qué OP no hizo?). – jcollum

3

Supongo que esto es C#? F # ha construido formas de manejar ambos problemas (tipo BigInt y secuencias perezosas).

Puede usar ambas técnicas F # de C#, si lo desea. El tipo BigInt se puede utilizar razonablemente desde otros idiomas si agrega una referencia al ensamblaje F # central.

Las secuencias diferidas son básicamente simples enumeradores amigables de la sintaxis. Poner 100.000,000 de elementos en una lista no es un gran plan, por lo que debe reconsiderar sus soluciones para evitarlo. Si no necesita mantener la información a su alcance, ¡deséchela! Si es más barato recalcularlo que almacenarlo, ¡deséchelo!

9

En lo que respecta al Proyecto Euler, es posible que esté ladrando al árbol equivocado si está golpeando excepciones OutOfMemory. Desde su página web:

Cada problema se ha diseñado de acuerdo con una "regla de un minuto", lo que significa que aunque puede tomar varias horas para diseñar un algoritmo de éxito con los problemas más difíciles, una implementación eficiente permitirá una solución que se obtendrá en una computadora de modesta potencia en menos de un minuto.

+0

Esperemos que ya se haya dado cuenta de eso. – ine

+0

lol, sí. No soy mega matemático. Aunque espero aprender algo –

+0

, puedes pasar bastante bien con la teoría de números básica y la teoría de conjuntos. Lea sobre la prueba de primalidad Miller Rabin para muchos de esos problemas de números primos. –

1

En cuanto a la definición de la memoria que usará una aplicación, puede verificar la memoria disponible antes de realizar una operación utilizando la clase MemoryFailPoint.

Esto le permite preasignar la memoria antes de realizar la operación, por lo que puede verificar si una operación fallará antes de ejecutarla.

4

Como dijo el usuario Jakers, si usa Big Numbers, probablemente lo esté haciendo mal.

De los problemas de ProjectEuler que he hecho, ninguno ha requerido cálculos de números grandes hasta ahora. Se trata más de encontrar el algoritmo adecuado para evitar números grandes.

¿Quieres consejos? Publique aquí, y podríamos tener un hilo de Euler interesante iniciado.

+2

¿Un voto negativo al azar, sin comentarios, más de un año y medio desde la publicación original? ¡Qué curioso! – abelenky

+3

Aquí, tiene una corrección ascendente. – SteveCav

1

No necesita utilizar BigInteger Puede hacer este evento con un conjunto de números de cadena.

class Solution 
{ 

    static void Main(String[] args) 
    { 
     int n = 5; 
     string[] unsorted = new string[6] { "3141592653589793238","1", "3", "5737362592653589793238", "3", "5" }; 

     string[] result = SortStrings(n, unsorted); 

     foreach (string s in result) 
      Console.WriteLine(s); 
     Console.ReadLine(); 
    } 
    static string[] SortStrings(int size, string[] arr) 
    { 

     Array.Sort(arr, (left, right) => 
     { 

      if (left.Length != right.Length) 
       return left.Length - right.Length; 
      return left.CompareTo(right); 
     }); 

     return arr; 
    } 
} 
+1

Pero, ¿cómo los agregarías? – FCin

+0

Abhilash Virat, ¿puede explicarnos cómo funciona la función Array.Sort() Lamda? No lo estoy siguiendo. –

Cuestiones relacionadas