Hallo,
im Rahmen eines Schulprojektes haben wir die Aufgabe gehabt einen Primzahlenfinder zu programmieren, dass habe ich auch schon geschafft (also ich versuche nicht mir hier meine Hausaufgaben machen zu lassen!!!), allerdings habe ich jetzt rein hobbymäßig überlegt, diesen Primzahlenfinder so zu programmieren, dass er schneller zum Ergebnis kommt, daher ein paar Modifikationen, allerdings schmeisst er mir jetzt nicht mehr das gewünschte Ergebnis aus. Unten mal den kommentierten Code, ich hoffe ihr könnt den Fehler finden.
Vielen Dank schon mal im Vorraus.
EDIT: hab im Code noch nen bisschen was geändert.. der macht allerdings noch Fehler der erste ist die ausgegebene "25"...
Delphi-Quellcode:
procedure TForm1.BstartClick(Sender: TObject);
var primzahl: array of integer;
arrlength,a,zahl,rest,anzahl:integer;
prim: boolean;
begin
stop:=false;
LBprimzahlen.Items.Clear;
setlength(primzahl,10000);
arrlength:=9999;
anzahl:=0;
primzahl[0]:=1;
primzahl[1]:=2;
a:=-1;
zahl:=2;
repeat
a:=-1;
repeat
a:=a+1;
prim:=true;
showmessage('a:'+InttoStr(a)+' primzahl[a]:'+InttoStr(primzahl[a])+' zahl:'+Inttostr(zahl));
{diese zeile ist nur zum Fehlerfinden wichtig, beim endgültigen Programm soll sie auskommentiert werden}
if (zahl=primzahl[a]) or (zahl<primzahl[a]) or (primzahl[a]=1) then
begin
showmessage('zahl ist gleich primzahl[a] oder zahl ist kleiner primzahl[a]'); //auch diese Zeile nur zum Fehlerfinden
end
else
begin
rest:=zahl MOD primzahl[a];
if rest=0 then //wenn der rest=0 ist handelt es sich nicht um eine Primzahl
begin
prim:=false;
break;
end;
end;
{bis hier muss sich die Schleife mit allen gepspeicherten Primzahlen wiederholen,
nur wenn der Rest nie 0 ist handelt es sich um eine Primzahl}
until primzahl[a]>=sqrt(zahl);
{wenn die höchste getestete Zahl kleiner als die Wurzel der getesteten Zahl ist kann die Abfrage
abgebrochen werden}
if prim=true then //wenn es eine Primzahl ist..
begin
LBprimzahlen.Items.add(InttoStr(zahl)); //.. die Zahl der Liste zuweisen
anzahl:=anzahl+1; //.. den Counter der Primzahlenanzahl erhöhen
Lamount.Caption:=InttoStr(anzahl); //.. die Primzahlenanzahl ausgeben
if arrlength=anzahl+1 then
begin
arrlength:=arrlength+10000;
SetLength(primzahl,arrlength);
end; //.. die Primzahl dem Array der Primzahlen zuweisen
primzahl[a+1]:=zahl;
end;
if zahl>2 then
//falls Zahl höher als zwei nur noch bei ungeraden Zahlen testen
begin
zahl:=zahl+2;
end
else if zahl=2 then
begin
zahl:=zahl+1;
end;
application.processmessages; //Zugriff eines anderen Buttons ermöglichen welcher Stop auf True setzt
until stop=true;
end;