Die Suche nach einer Primzahl
Ich habe Probleme mit einer Aufgabe. Ich muss Sie finden und warnen den Benutzer, wenn die Zahl eine Primzahl ist oder nicht.
Hier ist mein code:
int a = Convert.ToInt32(number);
if (a % 2 !=0 )
{
for (int i = 2; i <= a; i++)
{
if (a % i == 0)
{
Console.WriteLine("not prime");
}
else
{
Console.WriteLine("prime");
}
Console.WriteLine();
}
}
else
{
Console.WriteLine("not prime");
}
Console.ReadLine();
Wo habe ich falsch gemacht, und wie kann ich es beheben?
- for (int i = 3; i < a; ich++).............Ändern, wie dies
- Zunächst einmal müssen Sie lernen, was Primzahlen sind. 2 ist eine Primzahl. Ihre erste
if
-Anweisung sagt etwas anderes. Dann sollten Sie den E-Modul für jede bekannteprime
nicht jedem bekanntnumber
von 2 bis Zahl. - fügen Sie einfach eine Bedingung, dass i = a - 1 und dann schreiben Sie es, wie prime oder nicht prime
- Sie können auch überprüfen, nur bis zur Quadratwurzel der Zahl.
- Es gibt so viel mehr, das ist falsch mit dem code.
- ja, ich Stimme Sani Huttunen
- Doppelte? - stackoverflow.com/questions/3285562/prime-number-formula
- Nicht duplizieren. Die Frage ist nicht, 'write a prime number generator', es ist 'wo habe ich bloß falsch gemacht'.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Primzahlen teilbar ist durch 1 und sich selbst, müssen Sie prüfen, ob Zahl hat genau zwei Teiler ab, bis Anzahl, dann ist es eine Primzahl.
Können Sie überspringen eine iteration, wie wir wissen, alle ganzen zahlen sind teilbar durch 1, dann haben Sie genau auf Teiler für Primzahlen. Seit dem 1 hat nur einen Teiler, die wir brauchen, um es zu überspringen, da es nicht prime. Also Zustand würde zahlen, wenn Sie nur einen Teiler außer 1 und der Zahl sollte nicht ein als eine ist nicht Primzahl.
Ihnen gedruckte prime oder nicht prime, und fuhr Fort mit der Schleife, anstatt zu stoppen. Die
%2
überprüfen ist nicht wirklich notwendig. Entsprechend modifiziert:Vermutlich dein code ausgeben, eine Vielzahl von Nachrichten, die ein bisschen Durcheinander und sinnlos? Es gibt 3 wichtige Fragen:
Ihnen sorglosen brechen aus Ihrem for-Schleife wenn Sie sich entschieden haben, es kann nicht sein, prime
Sind Sie der Annahme, dass es prime, wenn es vielleicht nicht sein, siehe die Kommentare im code unten.
Sind Sie im Vergleich zu einem selbst, und das wird immer teilbar durch a, die <= in der for-Bedingung muss sein, <
Code:
Wie andere erwähnt haben, man konnte nur die Schleife, um die Quadratwurzel der eine, von pro-Bewertung der Quadratwurzel und ersetzen Sie diese Zeile:
mit dabei:
Ist es wichtig, pro-bewerten Sie Sie sonst Ihr Programm ausgeführt wird viel langsamer, anstatt schneller, als jede iteration umfasst einen square root operation.
Wenn Sie nicht wie springen Aussagen (ich Liebe goto-Anweisungen), schreiben Sie einen Kommentar und ich werde es zu ersetzen, wird ein breakout-boolean (oder siehe Dukeling mehr neue Antwort).
Ich getan habe, viel zu viel prime überprüfen.
Habe ich dieses:
Dies ist nicht GENAU das, was Sie suchen, obwohl das, was ich also tun würde ist, diese in einen background worker, aber mit der Liste der ulongs als konkurrierende Liste, oder etwas, das Sie zugreifen können, in 2 threads. Oder einfach nur sperren Sie die Liste, während es auf den zugegriffen wird. Wenn die prime-hssn nicht ausgearbeitet, doch, warten Sie, bis es ist.
Doch eine andere optimierte Möglichkeit ist die Verwendung Sieb des Eratosthenes Algorithmus.
Vom Wikipedia
C# - code
List
umgesetzt wird, sondernprimeNumbers.Remove(toRemove);
sieht sehr verdächtige. Wenn das tatsächlich löscht die Nummer aus der Liste, die Sie verloren haben O(1) random access, und somit viel langsamer ist.Remove
undContains
sind O(n) Operationen.O(nloglogn)
auf Random-Access-Modell. Key random access. Random access in sich selbst kannO(n)
wo x ist Zahl, um zu überprüfen, ob prime oder nicht