Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

Re: Optimierung eines Stück Codes für eine Wette!

  Alt 12. Nov 2009, 09:55
[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;
...
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat