Webstatt.org - Community seit 2006 - 2012 (2024?)

problem mit primzahl-check

user-114
29.01.2007 15: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?"zwinkern;
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 traurig. Habe ich irgendeinen dummen logischen Fehler gemacht oder ist es ein Syntaxproblem? Ich finde den Fehler einfach nciht.

Viele Grüße,
Abooya

this.tolowercase(); zwinkern
Avatar user-290
29.01.2007 16:57

Also den Algorithmus von Eratosthenes verstehe ich....aber dein Script irgendwie net.
Sry traurig
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:
alert("primzahlen: "+primzahlen+", primzahl: "+primzahl+", index: "+index+", indexzwei: "+indexzwei);


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

user-114
29.01.2007 17:32

ich habe mir halt folgendes gedacht:

function primzahlen ()
{
var wertebereich = prompt("Bis wieviel sollen die Primzahlen ausgegeben werden?"zwinkern;
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"

this.tolowercase(); zwinkern
Avatar user-290
29.01.2007 19: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 zwinkern. 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 lächeln


function primzahlen ()
{
var wertebereich = prompt("Bis wieviel sollen die Primzahlen ausgegeben werden?"zwinkern;
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+", "zwinkern;
}


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 ^^)

user-114
30.01.2007 14:01

jepp, danke, jetzt funktionierts.
gratulation zum edit-rekord Fettes Grinsen

Viele Grüße,
Abooya

this.tolowercase(); zwinkern