Thema: Delphi Primzahlenfinder

Einzelnen Beitrag anzeigen

Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#1

Primzahlenfinder

  Alt 10. Jun 2009, 17:24
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;
  Mit Zitat antworten Zitat