• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Anfänger hat Problem bei Primzahlenausgabe

oOLupusOo

New member
[Gelöst] Anfänger hat Problem bei Primzahlenausgabe

Hey Leute!

Ich versuche seit 5 Tagen Javascript zu lernen.
Jetzt habe ich mir als eigene Aufgabe gemacht, ein Script zu schreiben, sodass Primzahlen ausgegeben werden.
Ich bin mir sicher, dass es mit Schleifen viel schneller geht, aber die muss ich noch komplett lernen. Aber es muss doch auch so irgendwie gehen.
Ich finde die Lösung nicht. Laut den alert Befehlen von mir funktioniert aber an sich alles in der richtigen Reihenfolge.
Hoffentlich kann mir wer helfen, auch wenn es bestimmt zu unnötig kompliziert geschrieben ist, und so nah wie möglich bei meinen Script bleiben und mir sagen, was ich genau falsch gemacht habe.

Code:
var Primzahlen = [1,2]

Ueberpruefung(3,2);

function Ueberpruefung(Zahl,Divisor){;

var ZahlErgebnis = Zahl / Divisor;
var Ausgabe = String(ZahlErgebnis);
var suche = Ausgabe.indexOf('.');

if(Primzahlen.length == 30) {
	window.document.write(Primzahlen);
	}
	else if(suche == true && Zahl != Divisor) {
		//alert("1")
		Ueberpruefung(Zahl,++Divisor)}
		
	else if (suche != true && Zahl == Divisor){
			Primzahlen[Primzahlen.length] = Zahl
			//alert("2")
			Ueberpruefung(++Zahl,2)}
		
	else if (suche != true && Zahl != Divisor) {
			//alert("3")
			Ueberpruefung(++Zahl,2)}
}
 
Zuletzt bearbeitet von einem Moderator:
Geändert von mikdoe (Heute um 07:36 Uhr) Grund: Hab alles umgeschrieben und das Problem anders gelöst. mikdoe: Präfix geändert

Bin ein wenig verwirrt wer hat was geändert, mikdoe oder 26oOLupusOo.


Der Code funktioniert nicht, da indexOf('.') nicht true oder false Zurückgibt und String(ZahlErgebnis); wirft immer "maximum call stack size exceeded";

Meine Version davon ohne string Umwandlung:
Code:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">

<head>
    <title>determine prime numbers</title>

</head>

<body>
    <p id="ausgabe"></p>

    <script type="text/javascript">
        var Primzahlen = [1, 2]
        Ueberpruefung(3, 2);
        
        function isFloat(n) {
            return n === Number(n) && n % 1 !== 0;
        }

        function Ueberpruefung(Zahl, Divisor) {;
            var ZahlErgebnis = Zahl / Divisor;

            if (Primzahlen.length == 30) {
                document.getElementById("ausgabe").innerHTML=Primzahlen;
            } else if (isFloat(ZahlErgebnis) == true && Zahl != Divisor) {
                //alert("1")
                Ueberpruefung(Zahl, ++Divisor)
            } else if (isFloat(ZahlErgebnis) != true && Zahl == Divisor) {
                Primzahlen.push(Zahl)
                    //alert("2")
                Ueberpruefung(++Zahl, 2)
            } else if (isFloat(ZahlErgebnis) != true && Zahl != Divisor) {
                //alert("3")
                Ueberpruefung(++Zahl, 2)
            }
        }
    </script>
</body>
</html>

Oder Rekursiv mit 2 Funktionen:
Code:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
    <title>determine prime numbers</title>

 </head>
<body>
<p id="ausgabe"></p>

<script type="text/javascript">

var primeNumbers = [];

prime(1,100);//between 1 and 100

function prime(from,to){
    var N;
    if (from === 1) from++;
    if (from <= to) {
        N = isPrime(from,2);
        if (N === true) {
        primeNumbers.push(from);
        document.getElementById("ausgabe").innerHTML=primeNumbers;
        }
        prime(from+1,to);
    }
}


function isPrime(n,i){
    if (n%i===0 && n !==2 && n!==i) {
        return false;
    }else{
        if (i < Math.sqrt(n)) {
            return isPrime(n,i+1);
        }else{
            return true;
        }
    }
}


</script>
</body>
</html>

Sollte eigentlich alles noch im Rahmen des lesbaren sein für einen Js Beginner.:)

MfG Xorg1990
 
Erst einmal: Danke Xorg1990! Ich werde mir mal was davon abschauen :)

Gerne Mikdoe! Ich habe, wie xorg1990 schon gesagt hat, den Wert 1 bei suche immer rausbekommen. Somit ein true wert. Aber ab der Zahl 10 kommt der Wert 2 raus und somit != true. also Habe ich es in <1 geändert. Dazu habe ich einfach mit document.write gearbeitet als mit einen Alert. Mein Code sieht jetzt so aus:

Code:
Ueberpruefung(3,2);

function Ueberpruefung(Zahl,Divisor){;

var ZahlErgebnis = Zahl / Divisor;
var Ausgabe = ZahlErgebnis + ""
var suche = Ausgabe.indexOf(".");


	if(suche >= 1 && Zahl != Divisor) {
		Ueberpruefung(Zahl,++Divisor)}
		
	else if (suche != true && Zahl == Divisor){
			document.write(Zahl + ", ")
			Ueberpruefung(++Zahl,2)
			}
		
	else if (suche != true && Zahl != Divisor) {
			Ueberpruefung(++Zahl,2)}
			
}
 
Zuletzt bearbeitet:
@xorg: deine Funktion isPrime könnte man noch performanter gestallten. Du hast da das globale (suboptimal, aber hier verständlich) Array in denen du die Primzahlen speicherst. Du musst also nicht bei jeder Zahl wieder bei 2 anfangen zu testen, sondern weißt, dass bis zur größen Zahl in dem Array keine anderen Zahlen Primzahlen sind.

@oOLupusOo:

Zu document.write:
http://www.w3.org/html/wg/drafts/html/CR/webappapis.html#dynamic-markup-insertion schrieb:
This method has very idiosyncratic behavior. In some cases, this method can affect the state of the HTML parser while the parser is running, resulting in a DOM that does not correspond to the source of the document (e.g. if the string written is the string "<plaintext>" or "<!--"). In other cases, the call can clear the current page first, as if document.open( ) had been called. In yet more cases, the method is simply ignored, or throws an exception. To make matters worse, the exact behavior of this method can in some cases be dependent on network latency, which can lead to failures that are very hard to debug. For all these reasons, use of this method is strongly discouraged.
 
Zurück
Oben