Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi errechnet keine Primzahlen größer als 5000 (https://www.delphipraxis.net/172097-delphi-errechnet-keine-primzahlen-groesser-als-5000-a.html)

fox67 12. Dez 2012 16:30

Delphi errechnet keine Primzahlen größer als 5000
 
Hallo ich habe folgendes Prgramm programmiert
Delphi-Quellcode:
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.
Wenn man einen größeren Wert als 5000 ein gibt fängt delphi einfach noch mal von vorne an mit dem rechnen. Warum?

Jonas Shinaniganz 12. Dez 2012 16:32

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 ;)

fox67 12. Dez 2012 16:34

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Heißt das das eine Integer nicht größer als 5000 sein kann?

fox67 12. Dez 2012 16:34

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Welchen Zähler?

Sir Rufo 12. Dez 2012 16:35

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Ich weiß nicht was du meinst, aber wenn du am Anfang
Delphi-Quellcode:
Wert := I div 2;
schreibst, dann läuft dein Programm schneller ;)

fox67 12. Dez 2012 16:40

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Jetzt läßt es aber 3 aus

Jonas Shinaniganz 12. Dez 2012 16:44

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Wenn man einen größeren Wert als 5000 ein gibt fängt delphi einfach noch mal von vorne an mit dem rechnen. Warum?
Anhang 38236

Was meinst du?

fox67 12. Dez 2012 16:49

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Muss woll an meinem Pc gelegen haben jetzt klappt es auch bei mir.
Danke trotzdem

Sir Rufo 12. Dez 2012 17:48

AW: Delphi errechnet keine Primzahlen größer als 5000
 
Zitat:

Zitat von fox67 (Beitrag 1195270)
Jetzt läßt es aber 3 aus

Stimmt, muss ja auch
Delphi-Quellcode:
Wert := ( I + 1 ) div 2;
sein :)

Jonas Shinaniganz 12. Dez 2012 18:01

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:
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.
Da kann man selbstverständlich immernoch einiges optimieren und besser machen. Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz