Wie prüft man in "C", ob eine Zahl eine Primzahl ist?

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.

Theroth  13.06.2017, 22:47

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.

2
PWolff  14.06.2017, 00:00
@Theroth

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
}


1
ceevee  14.06.2017, 12:26
@PWolff

Die langsame Wurzelberechnung kann man mit

for (int i = 2; i * i <= zahl; i++) {

in dem Fall ganz umgehen, das läuft dann sogar noch einen Ticken schneller.

Du hast aber recht, man muss nicht bis zur Hälfte der zur prüfenden Zahl rechnen, bis zur Wurzel reicht.

0

Dein While Statement ist syntaktisch falsch.

while (Bedingung) {

do something;

}

Ich sehe keine öffnende geschweifte Klammer in deinem Code...

SooSSaaS 
Fragesteller
 13.06.2017, 22:49

entschuldige, mir ist beim herauskopieren ein fehler unterlaufen

0
PWolff  13.06.2017, 23:56

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.

0
ETechnikerfx  14.06.2017, 07:41
@PWolff

Nein, in seinem Code ist tatsächlich ein syntaktischer Fehler enthalten, da eine schließende geschweifte Klammer zuviel vorhanden ist ( nach counter ++ )

0

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;
}
ceevee  13.06.2017, 23:28

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.

1