Wie prüft man in "C", ob eine Zahl eine Primzahl ist?
/ Primzahl.c /
include includemain()
{ int zahl=16; //Zum Testen
int counter = 1; //Counter für die Schleife
int rest = 1; //Variable für den Rest (Modulo)
while (counter < (zahl-1)) //Solange counter < 15 (Also von 1 bis 14)
rest = zahl%(zahl-counter); //(16/Alle kleineren natürlichen Zahlen bis auf 1)
if (rest=0) //Ist die Zahl Restfrei durch eine kleinere natürliche Zahl teilbar, ist die Zahl keine Primzahl;
{ printf("Diese Zahl ist keine Primzahl"); }
counter++; //Counter wird um 1 erhöht und die Schleife beginnt erneut }
system("pause"); //Damit das Programm sich nach beendigung seiner Aufgabe nicht gleivh selbst auslöscht }
Das Programm funktioniert nicht. Deswegen meine Frage: Wo liegt der Fehler?
Danke im Voraus ;)
3 Antworten
Es gibt keine Funktion die das auf Anhieb kann also ist es immernoch ein mathematisches Mysterium rund um die Primzahlen.
Was du machen kannst ist alle Zahlen prüfen die kleiner als die hälfte deiner zu testenden Zahl ist sind ob sie bei einer Division keinen Rest ergeben. Das geht auch noch bei anschaulich kleinen Zahlen. Die Zeit wird aber rapide zunehmen beim vergrößern der Zahl.
Wenn man eine Funktionsbibliothek eingebunden hat, reicht
i <= sqrt(zahl)
(es könnte allerdings zu Rundungsfehlern kommen, außerdem ist die Wurzelberechnung langsam. Besser:)
int imax = (int)sqrt(zahl);
// weitere Vorbereitungen
for (int i = 2; i <= imax; i++) {
// Schleifenkörper
}
Dein While Statement ist syntaktisch falsch.
while (Bedingung) {
do something;
}
Ich sehe keine öffnende geschweifte Klammer in deinem Code...
Das Blöde bei so was ist, dass es nicht syntaktisch falsch ist.
Für den Compiler besteht dann eben der Schleifenkörper nur aus der allerersten Anweisung nach dem Schleifenkopf while (Bedingung).
Ich habe mir angewöhnt, auch um einzelne Anweisungen in einem Schleifenkörper (oder einem if-Block etc.) geschweifte Klammern zu setzen, um solche Fehler auf den ersten Blick zu sehen.
Nein, in seinem Code ist tatsächlich ein syntaktischer Fehler enthalten, da eine schließende geschweifte Klammer zuviel vorhanden ist ( nach counter ++ )
entschuldige, mir ist beim herauskopieren ein fehler unterlaufen
Moin, mit den ganzen Kommentaren und der Formatierung ist mir das zu doof da durchzusteigen. hier ist wie es funktionieren würde:
int main(){
int zahl = 16;
int counter = 3;
if(zahl < 2 && zahl > -2)
printf("%d ist nicht Prim!", zahl);
for(; counter < zahl; counter++)
{
if(zahl % counter == 0)
{
printf("%d ist nicht Prim!", zahl);
return 1;
}
}
printf("%d ist Prim!", zahl);
return 1;
}
Dein Programm gibt aus, dass 4 und -20 Primzahlen sind. ;)
Zum einen muss Counter bei 2 und nicht bei 3 anfangen, zum anderen verstehe ich nicht, warum du nur Zahlen abfängst, die zwischen -2 und 2 liegen. Es gibt keine negativen Primzahlen.
Anhang: Löse es doch mit einer For-Schleife int zahl = 16 for (int i = 2; i <= zahl/2; i++) { if (zahl%i == 0) return false; } return true; mit dieser Variante sparst du Zeit da siw beim ersten zutreffen direkt abbricht und sagt das es keine Primzahl ist.