Willkommen in der Webstatt Zum Webstatt Blog und Stories
Abooya am 29.01.07 16:34

hallo,
ich muss für die schule ein programm schreiben, dass bis zu einem bestimmten Wert alle Primzahlen ausgibt. Mein Versuch sieht bisher so aus:
function primzahlen ()
{
var wertebereich = prompt("Bis wieviel sollen die Primzahlen ausgegeben werden?");
var primzahlen = new Array(2);
var index=0;
var indexzwei=0;
var primzahl = 1;
while(index<=wertebereich)
{
while(indexzwei<=primzahlen.length())
{
if((index%primzahlen[indexzwei])==0)
{
primzahl=0;
}
indexzwei=indexzwei+1;
}
if(primzahl==1)
{
var lalilu= primzahlen.push(index);
document.write(index);
primzahl=0;
}
index = index+1;
}
}

das ganze funktioniert auf der basis des siebes des eratosthenes (jede zahl ist als zerlegung von primzahlen darstellbar, -> dass alle zahlen, die nicht durch eine primzahl kleiner als sie selbst teilbar sind, automatisch auch eine primzahl ist). da gibt es nur ein problem: er kommt nur in die erste schleife und die durchläuft er auch nur einmal :(. Habe ich irgendeinen dummen logischen Fehler gemacht oder ist es ein Syntaxproblem? Ich finde den Fehler einfach nciht.

Viele Grüße,
Abooya

netcup.de Warum gibt es hier Werbung?
Rene Rene am 29.01.07 17:57

Also den Algorithmus von Eratosthenes verstehe ich....aber dein Script irgendwie net.
Sry :(
Die Schleifen werden schon öfters durchlaufen...es wird halt nur irgendwie "Mist" in den Variablen abgespeichert.

Einfach mal folgende Zeile zwischen Zeile 24 und 25 eintippen, um die Variablen zu kontrollieren und du siehst, dass die Schleife mehrmals durchläuft:

Quote
alert("primzahlen: "+primzahlen+", primzahl: "+primzahl+", index: "+index+", indexzwei: "+indexzwei);


Edit: achso...primzahlen.length anstatt primzahlen.length() ...!!
Algorithmus funktioniert aber trotzdem nicht ;)

Abooya am 29.01.07 18:32

ich habe mir halt folgendes gedacht:
function primzahlen ()
{
var wertebereich = prompt("Bis wieviel sollen die Primzahlen ausgegeben werden?");
var primzahlen = new Array(2);
var index=0;
var indexzwei=0;
var primzahl = 1;
while(index<=wertebereich)
{
// in der schleife werden alle zahlen von null bis zur obergrenze durchlaufen
while(indexzwei<=primzahlen.length)
{
//diese schleife wird so oft durchlaufen, wie elemente im array primzahlen sind
if((index%primzahlen[indexzwei])==0)
{
//wenn die aktuelle zahl(index) durch die aktuelle primzahl teilbar ist, wird die variable primzahl auf 0 gesetzt -> der aktuelle index ist keine primzahl
primzahl=0;
}
//inkrementieren des indexes für die zweite schleife
indexzwei=indexzwei+1;
}
if(primzahl==1)
{
//wenn die variable primzahl bisher noch nicht auf null gesetzt wurde, war die zahl durch keine der primzahlen im array teilbar. sie wird als primzahl an den primzahlenarray angehängt und ausgegeben.
var lalilu= primzahlen.push(index);
document.write(index);
//die zeile war schmarrn
}
//primzahl wird auf 1 zurückgesetzt
primzahl=1;
//erster zähler wird inkrementiert
index = index+1;
}
}



Viele Grüße,
Abooya

PS: das ist genaugenommen kein "echter" eratosthenes, sondern sozusagen ein "umgekehrter"

Rene Rene am 29.01.07 20:04

okay...
Der Index muss bei 2 starten...denn 1%n ist immer ungleich null (ok, außer bei 1). Weshalb zu anfang gleich 1 als Primzahl erkannt wird, was ja nicht stimmt. Also hat er bei dir dann jede Zahl durch 1 geteilt und demnach war keine folgende Zahl mehr eine Primzahl ;). Hinzu kommt, dass du vergessen hast, den indexzwei zurückzusetzen.

Lediglich die zwei wird nicht als Primzahl erkannt (da ja 2/2 teilbar ist und das Script deshalb die 2 als keine Primzahl vermerkt). Vielleicht sollte man explizit eine Abfrage für die 2 einbauen oder so :)

function primzahlen ()
{
var wertebereich = prompt("Bis wieviel sollen die Primzahlen ausgegeben werden?");
var primzahlen = new Array(2);
var index=2;
var indexzwei=0;
primzahl=1;

while(index<=wertebereich)
{
while(indexzwei<primzahlen.length)
{

if((index%primzahlen[indexzwei])==0 && index!=primzahlen[indexzwei])
{
primzahl=0;
}

indexzwei=indexzwei+1;
}
if(primzahl==1)
{

var lalilu= primzahlen.push(index);
document.write(index+", ");
}


primzahl=1;
indexzwei = 0;

index = index+1;
}
}


edit: falscher kasten ^^
edit2: hatte noch das alert drin . Außerdem keine Trennung der Zahlen durch Komma ^^
edit... : If-Abfrage in Zeile 14 erweitert, weshalb jetzt auch die 2 als prim erkannt wird. (yeah...10mal edit. neuer Rekord ^^)

Abooya am 30.01.07 15:01

jepp, danke, jetzt funktionierts.
gratulation zum edit-rekord :D

Viele Grüße,
Abooya

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt