Frage

Ich versuche, durch die Probleme zu arbeiten projecteuler.net aber ich halte läuft in ein paar Probleme.

Die erste ist eine Frage der Speicherung großer quanities von Elementen in einer List<t>. Ich erhalte OutOfMemoryException Jahre, als große Mengen in der Liste zu speichern.

Nun gebe ich zu, ich könnte diese Dinge nicht in der besten Art und Weise tun, aber ist es eine Möglichkeit, zu definieren, wie viel Speicher kann die App verbrauchen?

Es stürzt in der Regel, wenn ich abour 100.000.000 Elemente erhalten: S

Zweitens erfordern einige der Fragen, die Zugabe von massiven Zahlen. Ich benutze ulong Datentyp, wo ich die Zahl denken, geht super groß zu bekommen, aber ich schaffe noch vorbei an der größten unterstützten int wickeln und sich in negative Zahlen.

Haben Sie irgendwelche Tipps für mit unglaublich großer Zahl zu arbeiten?

War es hilfreich?

Andere Tipps

Sie müssen eine große Anzahl Klasse verwenden, die einige grundlegende mathematische Prinzipien verwendet diese Operationen aufzuteilen. Diese Implementierung einer C # BigInteger Bibliothek auf CodePoject die vielversprechendsten zu sein scheint. Der Artikel hat einige gute Erklärungen, wie Operationen mit massiven Zahlen arbeiten, wie gut.

Siehe auch: Big ganze Zahlen in C #

Soweit Projekt Euler geht, können Sie den Holzweg sein könnte, wenn Sie OutOfMemory Ausnahmen schlagen. Von ihrer Website:

  

Jedes Problem wurde entwickelt, nach einer „Ein-Minuten-Regel“, was bedeutet, dass, obwohl es mehrere Stunden dauern kann, mit schwierigeren Problemen einen erfolgreichen Algorithmus zu entwerfen, eine effiziente Implementierung einer Lösung auf einem bescheiden zu erhalten ermöglichen betriebenen Computer in weniger als einer Minute.

Als Benutzer Jakers gesagt, wenn Sie große Zahlen verwenden, wahrscheinlich tun Sie es falsch.

Von den Project Euler Problemen, die ich gemacht habe, keine hat große Zahl Mathematik erforderlich bisher. Sein mehr über den richtigen Algorithmus zu finden große Zahlen zu vermeiden.

Möchten Sie Hinweise? Stellen Sie hier, und wir könnten eine interessante Euler-Thread gestartet haben.

Ich nehme an, dies ist C #? F # ist in einer Weise, Handling sowohl diese Probleme (BigInt Art und faul Sequenzen) gebaut.

Sie können mit beiden F # Techniken von C #, wenn Sie möchten. Der BigInt Typ ist recht brauchbar aus anderen Sprachen, wenn Sie einen Verweis auf den Kern F # Assembly hinzufügen.

Faule Sequenzen sind im Grunde nur freundliche Enumeratoren Syntax. 100.000.000 Elemente in einer Liste zu setzen ist nicht ein großer Plan, so dass Sie Ihre Lösungen überdenken sollten um das zu bekommen. Wenn Sie brauchen, um Informationen nicht zu halten um, werfen Sie es weg! Wenn es billiger ist es neu zu berechnen, als es zu speichern, werfen Sie es weg!

Sehen Sie die Antworten in dieser Thread . Sie müssen wahrscheinlich eine der Dritt großen Integer-Bibliotheken / Klassen warten verfügbar oder verwenden für C # 4.0, die einen native BigInteger Datentyp enthalten wird.

Soweit die Definition, wie viel Speicher eine App verwenden, können Sie den verfügbaren Speicher überprüfen, bevor eine Operation durchführen, indem Sie die MemoryFailPoint Klasse.

Auf diese Weise können Sie Speicher vorzubelegen vor der Operation zu tun, so können Sie überprüfen, ob eine Operation vor dem Ausführen von ihm fehlschlagen.

Sie brauchen nicht BigInteger verwenden Sie dieses Ereignis mit String-Array von Zahlen tun können.

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;
    }
}
string Add(string s1, string s2)
{
        bool carry = false;
        string result = string.Empty;

        if (s1.Length < s2.Length)
            s1 = s1.PadLeft(s2.Length, '0');
        if(s2.Length < s1.Length)
            s2 = s2.PadLeft(s1.Length, '0');

        for(int i = s1.Length-1; i >= 0; i--)
        {
            var augend = Convert.ToInt64(s1.Substring(i,1));
            var addend = Convert.ToInt64(s2.Substring(i,1));
            var sum = augend + addend;
            sum += (carry ? 1 : 0);
            carry = false;
            if(sum > 9)
            {
                carry = true;
                sum -= 10;
            }
            result = sum.ToString() + result;
        }
        if(carry)
        {
            result = "1" + result;
        }

    return result;
}

Ich bin nicht sicher, ob es eine gute Möglichkeit ist es der Handhabung, aber ich benutze die folgend in meinem Projekt.

Ich habe eine „doppelt theRelevantNumber“ Variable und eine „int PowerOfTen“ für jedes Element und in meiner jeweiligen Klasse Ich habe einen „int relevantDecimals“ Variable.

Also ... wenn eine große Anzahl angetroffen wird sie wie folgt behandelt:

Zuerst werden sie in x, yyy Form verändert. Also, wenn die Zahl 123456,789 inputed wurde und die „powerOfTen“ 10 ist, würde es so beginnen:

theRelevantNumber = 123456.789 PowerOfTen = 10 Die Zahl war dann: 123456,789 * 10 ^ 10

Es wird dann folgendermaßen geändert: 1,23456789 * 10 ^ 15

Es wird dann durch die Anzahl der relevanten Dezimalstellen gerundet (zB 5) auf 1,23456 und dann gespeichert zusammen mit „PowerOfTen = 15“

Beim Hinzufügen oder subracting Zahlen zusammen, eine beliebige Anzahl außerhalb der relevanten Nachkommastellen ignoriert. Bedeutung, wenn Sie nehmen:

1 * 10 ^ 15 + 1 * 10 ^ 10 wird es auf 1,00001 ändern, wenn "relevantDecimals" 5 ist, aber nicht ändern, wenn "relevantDecimals" ist 4.

Diese Methode machen Sie mit Zahlen umgehen können bis doubleLimit * 10 ^ intLimit ohne Probleme, und zumindest für OOP ist es nicht so schwer, den Überblick zu behalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top