Frage von SchornsteinXXL, 45

Wo liegt der Fehler in meinem JavaScript 'Programm'?

ich habe versucht ein Programm zu schreiben, welches ermittelt, ob eine Zahl eine Primzahl ist. jedoch funktioniert das nicht so ganz und ich finde meinen Fehler nicht. vielleicht kann mir ja jemand helfen :)

das Programm:

function primtest(x) {
  

   for (var n=2; n<(x/2+1) || (x<=2 && n<(x/2+1)); n++) {
       
       var endprims=[];
       
       if ((!(x%n==0) || x==2) && x!=1  && 0<x ) {
           
           endprims[endprims.length]=x;break
           
       }
    }

};

Antwort
von ceevee, 33

Dein Algorithmus sieht reichlich kompliziert aus (wo hast du den her?), ob der so funktioniert, weiß ich nicht. Beispielsweise könntest du mit einem

if (x < 2) {

return false;

}

am Anfang der Funktion die beiden Bedingungen massiv vereinfachen. Davon mal abgesehen gibt die Funktion nix zurück (es fehlt das return) und endprims.length ist immer 0. Immer endprims-Array wiederum ist allerdings nie ein Element drin.

Wie äußert sich denn "funktioniert nicht" in dem Programm? Rechnet die Funktion gar nicht oder erkennt sie keine / falsche Primzahlen?

Kommentar von ralphdieter ,

Wie äußert sich denn "funktioniert nicht"

Die Funktion probiert alle Zahlen von 2 bis ca. x/2. "Manchmal" legt sie ihr Argument x in ein Array, wirft dieses gleich wieder weg und bricht ab. Manchmal auch nicht.

"Manchmal" heißt: Wenn x>2 ist und eine Zahl ≤x/2 existiert, die kein Teiler von x ist. Vermutlich gilt das für die 5 und alle Zahlen ab 7. Ist aber egal, weil die Funktion so oder so nix zurück gibt :-)

Antwort
von nikolaiki, 6
  • var endprims=[]; gehoert vor die Schleife, sonst wird das Array jedesmal geloescht
  • endprims[endprims.length]=x; ist gekuenstelt. Ein Programm sollte klar beschreiben was es tut. Daher lieber endprims.push(x);
  • Der Fall x==1 muss vor der Schleife abgefragt werden. Sonst wird das Programm langsam und unübersichtlich.
  • Der Fall x==2 braucht keine Sonderbehandlung.
  • Einen logischen Fehler gibt es allerdings auch !(x%n==0). Das Gegenteil ist gefordert: Die Schleife sollte abbrechen sobald n Teiler von x (Zahl ist nicht Prim) oder n>x/2 (Zahl ist Prim).
Antwort
von RedKungFuMastr, 23

Dir ist schon klar, dass das Array außerhalb der for loop liegen sollte? Und mach doch deine for Loop nicht so kompliziert...

Letzter Punkt, keine Semikolons nach einer Function-Definition.

Keine passende Antwort gefunden?

Fragen Sie die Community