Primzahlrechner JavaScript?

5 Antworten

Mal davon abgesehen, dass das Testverfahren eher mittelmäßig effizient ist, ist der einzige "große" Fehler den ich daran finden konnte, dass das Ergebnis zu jedem Teilerkanidaten ausgegeben wird statt nur das Endergebnis.

Optimalerweise packst du den Primtest in eine Funktion und gibst wenn x%i==0 den Wert false zurück, ansonsten sobald der Test abgeschlossen ist true.

Hier noch ein paar Tipps zur Effizienzsteigerung:

  1. Keine Primzahl ist kleiner als 2. Falls x also kleiner als 2 sein sollte, kannst du sofort false zurückgeben.
  2. Es gibt genau eine einzige gerade Primzahl, nämlich die 2. Für den Fall dass x==2 kannst du also sofort true zurückgeben. Ansonsten wenn (x&1)==0 also wenn x gerade ist false.
  3. Durch die Ergebnisse von Punkt 1 und 2 kann der Schleifenzähler mit dem Wert 3 beginnen und in jedem Durchlauf um 2 erhöht werden. Damit sparst du bis zu 50% Laufzeit.
  4. Da es keine relevanten Teilerkanidaten gibt, die größer als die aufgerundete Quadratwurzel der zu testenden Zahl sind kann der Wert für border mit Math.ceil(Math.sqrt(x)) festgelegt werden.

In deinem Code sind mehrere kleine Fehler:

Primzahlen, sind alle Zahlen die nur durch 1 und sich selbst teilbar sind. Du prüfst ja schon auf 0 und auf 1... Das würde auf alle Zahlen zutreffen.

Statt i=0 musst du also mit i = 2 anfangen.

Dann gibt deine Schleife für jede Zahl aus, dass sie durch diese Zahl teilbar ist ("keine Primzahl"), oder nicht teilbar ist ("eine Primzahl) - was du aber eigentlich möchtest ist am Ende ausgeben, ob es eine Zahl gab, durch die es teilbar war.

Also erstellst du am Anfang des Programmes eine Variable isPrim, die du auf true setzt: var isPrim = true;

Wenn es einen Teiler gibt (x % i == 0), dann setzt du die Variable auf false.

Nachdem die Schleife durchlaufen ist, schaust du, wie die Variable ist. Ist sie true, dann gab es keinen Teiler, es muss also eine Primzahl sein. Ist sie false, dann gab es keinen Teiler.

Natürlich lässt sich das Ganze optimieren. So brauchst du nur bis Wurzel(x) prüfen, statt x/2

Außerdem kannst du die schleife mit "break;" abbrechen, wenn es einen Teiler gibt.


steezh 
Beitragsersteller
 15.03.2019, 16:53

was ist hier falsch?

<script>

            x = window.prompt("Zahl eingeben");

            border = x/2;

            isprim = true;

            for (i=2; i <= border; i++){

                if (x % i == 0){

                    isprim = false;

                } else {

                     isprim = true;

                }

            }

            if (isprim = true) {

                document.write("eine Primzahl")

            } else if (isprim = false) {

                document.write("keine Primzahl")

            }

            

            

        

        </script>

0
kmkcl  15.03.2019, 17:05
@steezh

Du darfst isprim nicht wieder auf true setzen. Beispiel: 12 ist durch 2 und 3 teilbar. Wenn du jetzt aber bei 5 ankommst, würde er sagen: ja, 12 ist nicht durch 5 teilbar, also prim...

0

1) Innerhalb der Schleife überprüft Ihr Skript zuerst eine Bedingung und sofort das Gegenteil. Ihr Code kann wie folgt vereinfacht werden:

<script>
	x = window.prompt("Zahl eingeben");
	border = x/2;
	for (i=0; i <= border; i++){
		if (x % i == 0){
			document.write("keine Primzahl");
		} else {
			document.write("eine Primzahl ");
		}
	}
</script>

2) Ihr Script zeigt das Ergebnis nach jeder Prüfung an, anstatt nur das Endergebnis anzuzeigen. Und das Programm stoppt nicht, wenn die Nummer nicht Primzahl ist.

Fügen Sie eine Einfachheitserkennungsfunktion hinzu und zeigen Sie das Testergebnis nur einmal ganz am Ende des Programms an.

Woher ich das weiß:Berufserfahrung – Ich erstelle Wordpress-Themes, Plugins und Online-calculator

steezh 
Beitragsersteller
 15.03.2019, 16:31

Was ist eine Einfachheitserkennungsfunktion und wie geht diese?

0
glebkema  15.03.2019, 16:40
@steezh

Ich wollte ein Zeichen hinzufügen, dass die Nummer Primzahl war.

Sie können zum Beispiel die Variable "dieseNummerIstPrimzahl" am Anfang des Skripts hinzufügen und den Wert "true" angeben. Sobald die nächste Prüfung zeigt, dass die Anzahl nicht Primzahl ist, müssen wir dieser Variablen den Wert "false" geben und die Schleife beenden.

Wenn am Ende des Skripts unsere Variable gleich "true" bleibt, dann sagen wir, dass die Nummer Primzahl ist. Und wenn die Variable gleich "false" ist, dann sagen wir, dass die Zahl nicht Primzahl ist.

0
steezh 
Beitragsersteller
 15.03.2019, 16:44
@glebkema

Habe den Quellcode etwas umgeändert, was passt diesmal nicht? Er gibt immer an es sei keine Primzahl.

<script>

            x = window.prompt("Zahl eingeben");

            border = x/2;

            for (i=0; i <= border; i++){

                if (x % i == 0){

                    let ergebnis = "nein";

                } else {

                     let ergebnis = "ja";

                }

            }

            if (ergebnis = "nein") {

                document.write("Keine Primzahl")

            } else if (ergebnis = "ja") {

                document.write("eine Primzahl")

            

        </script>

0
glebkema  15.03.2019, 16:48
@steezh

Jetzt schreiben Sie die Variable bei jeder Prüfung erneut. So vergisst sie die Ergebnisse früherer Prüfungen.

0
glebkema  15.03.2019, 16:53
@steezh
  1. Verwenden Sie boolesche Werte anstelle von String-Werten.
  2. Weisen Sie vor Beginn des Zyklus den Wert "true" zu.
  3. Weisen Sie nur "false" innerhalb der Schleife zu, und nur, wenn die Bedingung erfüllt ist.
0
steezh 
Beitragsersteller
 15.03.2019, 17:04
@glebkema

Wieso wird es dauerhaft als True angezeigt?

<script>

            x = window.prompt("Zahl eingeben");

            border = x/2;

            isprim = true;

            for (i=2; i <= border; i++){

                if (x % i == 0){

                    isprim = false;

                } else {

                     isprim = true;

                }

            }

            if (isprim = true) {

                document.write("eine Primzahl")

            } else if (isprim = false) {

                document.write("keine Primzahl")

            }

            

            

        

        </script>

0
glebkema  15.03.2019, 17:08
@steezh

Entfernen Sie diese beiden Linien aus dem Scheck in der Schleife. Sie verderben alles. Das einzig Wichtige ist der Beweis, dass die Zahl nicht Primzahl war.

        } else {
                    isprim = true;
0
glebkema  15.03.2019, 17:11
@steezh

Und am Ende des Codes genügt es, anstelle der Zeile 

      } else if (isprim = false) {

diese Zeile hier zu setzen:

      } else {
0
steezh 
Beitragsersteller
 15.03.2019, 17:11
@glebkema

Wieso die Klammer vor dem else auch? die gehört zu der for-schleife?

0
glebkema  15.03.2019, 17:17
@steezh

Und in dieser Zeile vergleichen Sie den Wert nicht mit "true", sondern weisen der Variablen den Wert "true" zu. Dies ist ein weiterer Grund dafür, dass das Ergebnis das gleiche war.

      if (isprim = true) {

Ein einzelnes Gleichheitszeichen bedeutet eine Zuweisung. Um übereinzustimmen, müssen Sie ein doppeltes oder dreifaches Gleichheitszeichen anstelle eines einzelnen verwenden. Und logische Variablen können selbst geprüft werden.

      if (isprim) {
        document.write("eine Primzahl")
      } else {
        document.write("keine Primzahl")
      }
0
glebkema  15.03.2019, 17:20
@steezh
Wieso die Klammer vor dem else auch? die gehört zu der for-schleife?

Anstelle dieses Codefragments

               if (x % i == 0){
                    isprim = false;
                } else {
                    isprim = true;
                }

lass nur diese Zeilen

                if (x % i == 0){
                    isprim = false;
                }
0
glebkema  15.03.2019, 17:42
@MonkeyKing

In keinem Fall. Durch eine solche Zuweisung wird der Verlauf früherer Prüfungen gelöscht.

Wenn die Bedingung nicht erfüllt ist, sollte die Variable überhaupt nicht berührt werden.

1

nun ja, du gehst ALLE zahlen von 0 bis zur x/2 durch und gibst für jede Zahl aus, ob sie modulo i = 0 ist


steezh 
Beitragsersteller
 15.03.2019, 16:20

und wie gebe ich sie einzeln aus?

0

Jedem, der in einem Programm durch 0 teilt, sollte ein elektrischer Schlag durch die Tastatur verpasst werden.