2016-12-14 4 views
0

Ich versuche zu lösen Frage 3 für Projekt Euler, gefunden here. Ich möchte es lösen, indem Sie eine Liste der Primzahlen mit Eratosthenes Sieb (gefunden here. Ich bin nicht annähernd fertig die Frage , aber ich habe in ein kleines Problem gerannt ...Generieren Primzahlen über Eratosthenes Sieb C#

Unten ist mein Code Ich habe gearbeitet, um dies zu tun.Allerdings, wenn ich diesen Code ausführen, stagniert es meinen Computer, und gibt eine 2 vor dem Abwürgen es mehr Es läuft offensichtlich, aber es scheint nicht zu sein, es richtig zu machen. Bevor es die Liste ausgibt, sollte es mich wissen lassen (nur prüfen, ob das Aufhängen vor der Ausgabe ist), es ist die Zuordnung der Liste ...

Wenn Sie nicht sicher sind, was vor sich geht, können Sie mir Hinweise geben, wie Sie den Code durchsuchen und seine verschiedenen Zeilen debuggen können? Ich habe Console.WriteLine in verschiedenen Bereichen versucht, aber es scheint nicht auf den Code zu reagieren.

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     long maxNum = 100; 
     double maxSqrt = Math.Floor(Math.Sqrt(maxNum)); 
     long basePrime; 
     // Make a list from 2 to maxNum 
     List<long> numberList = new List<long>(); 
     List<long> sievedList = new List<long>(); 
     for (long i = 2; i <= maxNum; i++) numberList.Add(i); 
     // Evaluate the first number of the list, if it is < maxSqrt skip it, create a list of multiples and Except them from numberList, else, numberList is completely Prime Factors 

     foreach (long number in numberList.Skip(1)) 
     { 
      basePrime = numberList[0]; 
      Console.WriteLine(basePrime); 
      while (number < maxSqrt) 
       { 
        if (number % basePrime == 0) 
        { 
         sievedList.Add(number); 
        } 
        numberList = numberList.Except(sievedList).ToList(); 
        sievedList.Clear(); 
       } 
     } 
    Console.WriteLine("Finished Allocating Primes"); 
    numberList.ForEach(Console.WriteLine); 
    } 
} 
+0

maxSqrt sollte sich nur ändern, wenn sich maxNum ändert. Ich habe den Eindruck, dass die Quadratwurzel einer Zahl der höchste ist, dessen Faktor sein kann und immer noch möglicherweise prim ist. – RaineAndrews

+3

Sie sollten jetzt wirklich lernen, den Debugger zu verwenden. Es hätte den Fehler in Ihrer 'while' Schleife in viel kürzerer Zeit gefunden, als Sie Ihre Frage hier erstellt haben. Wenn Sie Ihren Code durcharbeiten, können Sie viel über bessere Möglichkeiten zum Schreiben von Code lernen. Du änderst niemals 'number', so dass es immer'

+0

Also wird die While-Schleife ihren Wert nicht wirklich ändern, weil sich die Zahl nicht ändert, bis die Zahl größer ist als maxSqrt? – RaineAndrews

Antwort

1

Für Ihr unmittelbares Problem, ändern Sie die while zu einem if.

Ihr Code hat jedoch auch andere Probleme.

  • Ihre numberedList ist nur eine Liste von ganzen Zahlen 2-maxNum, die Sie mit einer for-Schleife sind bevölkern. Dann wiederholst du die Liste. Verwenden Sie stattdessen den Zähler der for-Schleife. Um zu protokollieren, welche Zahlen prim sind, funktioniert ein BitArray(Int32, Boolean) gut.
  • Das ermöglicht auch, die teuren LINQ-Erweiterungen loszuwerden. Wenn Sie eine Nicht-Primzahl finden, ändern Sie einfach ihren Index im BitArray. Wenn Sie eine Primzahl finden, fügen Sie sie der Liste hinzu.
+0

Ja, die vorherigen Kommentare haben gezeigt, dass es eine große Zeit ist! Ich habe daran herumgebastelt, aber wie du gesagt hast, hat es ernsthafte Probleme. Ich muss auf BitArray nachlesen, aber das sieht nach einem Game Changer aus. Vielen Dank! – RaineAndrews

Verwandte Themen