Primzahlprogramm
-
Guten Morgen,
eigentlich Ferien, aber ich sitze am Schreibtisch ...
Als Übungsaufgabe ein Programm, welches eine eingegebene Zahl überprüfen soll, ob es eine Primzahl ist oder nicht.Ist das soweit in Ordnung, oder was würdet Ihr noch ändern?
Ansich funktioniert der Code auf jeden Fall.thx
Casperpublic static void Main(string[] args) { int zahl = 0; bool prime = true; Console.WriteLine("Geben Sie eine Zahl ein: "); string line = Console.ReadLine(); zahl = Convert.ToInt32(line); if (zahl % 2 == 0) { prime = false; for (int n = 2; n < zahl; n++) { if (zahl % n == 0) { prime = false; break; //Wenn hier einmal false, dann kann es keine Primzahl sein, daher Ausstieg aus der Schleife?! } else { } } } if (prime == true) { Console.WriteLine("Ist eine Primzahl"); } if (prime == false) { Console.WriteLine("Ist keine Primzahl"); } }
-
http://www.dotnetperls.com/prime
http://stackoverflow.com/questions/1538644/c-determine-if-a-number-is-prime
http://stackoverflow.com/questions/3285562/prime-number-formula
http://forums.techarena.in/software-development/1071504.htm
-
Dein Programm hält alle ungeraden Zahlen für Primzahlen, vielleicht solltest du damit anfangen.
-
Stimmt eigentlich dieses Progamm?
http://dotnet-snippets.de/dns/pruefen-ob-eine-zahl-eine-primzahl-ist-SID227.aspxIm Prinzip macht es doch das selbe wie mein Code?!
-
Casper schrieb:
Stimmt eigentlich dieses Progamm?
Ja.
Casper schrieb:
Im Prinzip macht es doch das selbe wie mein Code?!
Dein Programm macht noch einiges mehr, und das macht es falsch.
Du prüfst zuerst, ob die Zahl durch 2 teilbar ist. Falls ja, suchst du nach weiteren Teilern, angefangen bei 2. Da die Zahl an dieser Stelle ja sowieso durch 2 teilbar ist, bricht diese Schleife immer im ersten Durchlauf ab. Ergebnis: keine Primzahl. Das ist soweit richtig, aber unsinnig implementiert.
Falls die Zahl nicht durch 2 teilbar ist, machst du nichts weiter, sondern kommst zu dem Ergebnis: Primzahl.
Spiel dein Progamm doch einfach mal für 9, 15, 25, 27 usw durch, dann siehst du, wo es schiefläuft.
-
Ok, danke - werde gleich nochmals meinen Code anschauen.
Wenn ich den gelinkten Beispielcode aufrufen, dann stimmen bei mir die Ergebnisse allerdings nicht
Aufruf
bool wert = CheckPrime(51); Console.WriteLine(wert.ToString()); Console.ReadLine();
Methode
public static bool CheckPrime(int Number) { for (int i = 2; i <= Number - 1; i++) { if (Number % i == 0) return true; } return false; }
Ausgabe
Wert 9 => true
Wert 17 => false
Wert 18 => true
Wert 51 => trueDie Zahl 51 ist doch eine Primzahl ... laut dieser Ausgabe allerdings nicht?!?!
-
Casper schrieb:
Die Zahl 51 ist doch eine Primzahl
51 ist 3 * 17 und damit keine Primzahl.
-
peinlich .... danke
-
Was mir spontan auffällt (ohne den Code getestet zu haben) Du mischst Englisch ('prime') mit Deutsch ('zahl'). Und was ist 'n'?
Meine Tipps zum Code-Design wären:
- bei einer Sprache bleiben
- Variablen eindeutig bezeichnen (wenn mal ein Kollege durch Krankheit oder so ausfällt sollten auch alle anderen sofort bescheid wissen wenn die in den Code schauen)Das mag zwar durchaus jetzt nach Haarspalterei klingen und in so einer kleinen Funktion vielleicht auch Overkill, aber denk mal riesig-große CRM-Projekte. Da macht es sich durchaus bezahlt auf solche Kleinigkeiten zu achten (aus Erfahrung gesagt).
Viele Grüße
Goa
-
@GoaZwerg Ich danke für die Hinweise. Werde in Zukunft stärker darauf achten.
-
Das waren noch einige unnötige Schleifendurchläufe drin.
[cs]
public static bool CheckPrime(int Number)
{
for (int i = 2; i <= (Number\2); i++)
{
if (Number % i == 0) return true;
}
return false;
}
-
Und sind es jetzt immer noch:
1. es reicht nur die ungeraden Zahlen zu testen (außer explizit einmal am Anfang mit der 2)
2. Sqrt(n) sollte die Abbruchbedingung sein (diese aber nur einmalig errechnen lassen!)
3. Und noch effizienter geht es mittels der Formel: p = 6k+1 oder p = 6k-1, s.a. http://de.wikipedia.org/wiki/Primzahl#Eigenschaften_von_Primzahlen