[edit]
Mist, hätte doch noch mal vor dem posten refresh drücken sollen,
hab das neben der Arbeit gecoded. Deswegen hat etwas gedauert
Uwe hat ja schon "meine" Lösung geposted.
[/edit]
Zitat von
R2009:
Am Algorithmus kann ich nur bedingt etwas ändern.
Die meiste Zeit geht durch unnötige Berechnungen drauf.
Da z.B. 2*3 = 3*2 ist, musst Du nur bis zur abgerundeten Wurzel prüfen.
Delphi-Quellcode:
...
{$A8,B-,C-,D-,E-,F-,G+,H-,I-,J-,K-,L-,M-,N+,O+,P-,Q-,R-,S-,T-,U-,V-,W-,X-,Y-,Z1}
procedure TForm1.Button1Click(Sender: TObject);
const
max_prim = 1000000;
var
prim: array of cardinal;
anz_prim: cardinal;
d, i, w: cardinal;
Anfg_Zeit: TDateTime;
begin
// Arraygröße
setlength(prim,80000); // reicht bei bis zu 1000000
// Zeitmessung
Anfg_Zeit := Now;
// Berechnung
Prim[1] := 2;
Prim[2] := 3;
Prim[3] := 5;
anz_Prim := 3;
d := 7;
repeat
w := Trunc(Sqrt(D)); // nur bis zur Wurzel testen, da sonst doppelt getestet wird. 2*3 = 3*2
i := 2; // div 2 ist unnötig, da inc(d,2)
while (D mod Prim[I] > 0) and (Prim[i] < w) and (i < anz_Prim) do inc(i);
If D mod Prim[I] > 0 then
begin
inc(anz_Prim);
Prim[anz_Prim] := D;
end;
inc(D,2);
until (D >= max_Prim);
// Zeitmessung
Caption := TimeToStr(now - anfg_zeit);
// Ausgabe
lst_ausgabe.Items.BeginUpdate;
for i := 1 to anz_prim do
begin
lst_Ausgabe.Items.Add(IntToStr(Prim[i]) + ' ist eine Primzahl!');
end;
lst_ausgabe.Items.EndUpdate;
// Zeitmessung
Caption := TimeToStr(now - anfg_zeit);
end;
...