![]() |
Delphi errechnet keine Primzahlen größer als 5000
Hallo ich habe folgendes Prgramm programmiert
Delphi-Quellcode:
Wenn man einen größeren Wert als 5000 ein gibt fängt delphi einfach noch mal von vorne an mit dem rechnen. Warum?
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm5 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Max :integer; Primzahlen : array of Integer; Anzahl : Integer; Wert : Integer; Primzahl : Boolean; end; var Form5: TForm5; I,X,F : Integer; XC : String ; implementation {$R *.dfm} procedure TForm5.Button1Click(Sender: TObject); var E: TObject; begin max := strtoint(edit1.Text); repeat inc(I); if not (I=0) and not (I=1) then begin Wert := I-1; if Wert <>1 then begin Primzahl := true; for F := 2 to Wert do begin if I mod F = 0 then begin Primzahl := false; end; end; if Primzahl then begin setlength(Primzahlen,Anzahl+1); Primzahlen[Anzahl] := I; Anzahl := Anzahl +1; end; end; end; until I = Max ; for X := 0 to Anzahl do begin XC := XC + ', '+inttostr(Primzahlen[X]); end; showmessage(XC); end; procedure TForm5.FormCreate(Sender: TObject); begin Anzahl := 0; I := 0; Wert := 0; F := 0; end; end. |
AW: Delphi errechnet keine Primzahlen größer als 5000
Mein Gehirn wittert einen Integer Overflow...
Ersetze deinen Zähler doch mal durch einen größeren ganzzahligen Datentypen ;) |
AW: Delphi errechnet keine Primzahlen größer als 5000
Heißt das das eine Integer nicht größer als 5000 sein kann?
|
AW: Delphi errechnet keine Primzahlen größer als 5000
Welchen Zähler?
|
AW: Delphi errechnet keine Primzahlen größer als 5000
Ich weiß nicht was du meinst, aber wenn du am Anfang
Delphi-Quellcode:
schreibst, dann läuft dein Programm schneller ;)
Wert := I div 2;
|
AW: Delphi errechnet keine Primzahlen größer als 5000
Jetzt läßt es aber 3 aus
|
AW: Delphi errechnet keine Primzahlen größer als 5000
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Was meinst du? |
AW: Delphi errechnet keine Primzahlen größer als 5000
Muss woll an meinem Pc gelegen haben jetzt klappt es auch bei mir.
Danke trotzdem |
AW: Delphi errechnet keine Primzahlen größer als 5000
Zitat:
Delphi-Quellcode:
sein :)
Wert := ( I + 1 ) div 2;
|
AW: Delphi errechnet keine Primzahlen größer als 5000
Weil du schon so mutig warst und deinen ganzen Code geteilt hast, habe ich mal die gröbsten Sachen rausgenommen ;)
Dinge wie "Globale Variablen", "redundante Abfragen" und "doppelte Initialisierung von Variablen" müssen ja nicht sein. Auch wenns mal schnell sein muss... Vielleicht bringts dir was:
Delphi-Quellcode:
Da kann man selbstverständlich immernoch einiges optimieren und besser machen. Grüße
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Edit1 : TEdit; Button1 : TButton; procedure Button1Click(Sender: TObject); public Max : integer; Primzahlen : array of Integer; Primzahl : Boolean; procedure OutPutMessage; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var I, F : Integer; begin max := strtoint(edit1.Text); I := 1; repeat if (I > 0) then begin Primzahl := true; for F := 2 to I - 1 do begin if ((I mod F) = 0) then begin Primzahl := false; Break; end; end; if (Primzahl) then begin SetLength(Primzahlen, High(Primzahlen) + 2); Primzahlen[High(Primzahlen)] := I; end; end; I := I + 2; until(I >= Max); OutPutMessage; end; procedure TForm1.OutPutMessage; var XC : String; I : Integer; begin for I := 0 to High(Primzahlen) do begin XC := XC + inttostr(Primzahlen[I]) + ', '; end; showmessage(XC); end; end. |
AW: Delphi errechnet keine Primzahlen größer als 5000
Und dann ist das noch so, das alle Primzahlen > 3 der Form 6n+/-1 sind. Also kann man alle Primzahlen so prüfen
Delphi-Quellcode:
Und die Funktion IsPrime prüft nicht bis Wert/2, sondern nur bis Sqrt(Wert) und da auch nur mit allen bisherigen Primzahlen, also:
// 2,3 => Primzahl
p := 5; repeat If IsPrime(P) then AddToPrimeList(P); If IsPrime(P+2) then AddToPrimeList(P+2); inc(P,6); until p>maxint-6; // oder so ähnlich
Delphi-Quellcode:
Ist aber ungetestet.
Function IsPrime (P : Integer): Boolean;
Begin MaxP := Trunc(Sqrt(P)); I := 0; While (Primes[I]<MaxP) do If P Mod Primes[I]<>0 then exit(false) else inc(I); exit(true) End; Und noch eigentlicher verwendet man 'Sieve of Atkin' oder 'Sieve of Eratosthenes'. Da bekommt man dann alle Primzahlen < 2^31 in so 1-2 Sekunden, wenn ich mich richtig erinnere. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz