Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Primzahlen (https://www.delphipraxis.net/155250-primzahlen.html)

Romiox 15. Okt 2010 12:07

AW: Primzahlen
 
Zitat:

Zitat von DeddyH (Beitrag 1055817)
Ich konnte es nicht lassen und habe Deine Funktion einmal etwas verkürzt:
Delphi-Quellcode:
function isprime(a: integer): Boolean; //soll testen ob a eine Primzahl ist
var Teiler: integer;
begin
  Result := a > 1;
  Teiler := Pred(a);
  while Result and (Teiler > 1) do
    begin
      Result := a mod Teiler <> 0;
      dec(Teiler);
    end;
end;

Danke, ich werd das mal nachvollziehen. :) Bin grad erst angefangen (Informatik 11.1),
hab noch nicht so'n großes Repertoire an Funktionen :)

Zitat:

Zitat von implementation (Beitrag 1055827)
Zitat:

Zitat von Romiox (Beitrag 1055814)
Hmm, :headdesk: gibts nicht?

Meinst du :wall:?

Noe, schon Desk. Aber :wall: tuts genauso :>

Aphton 15. Okt 2010 15:29

AW: Primzahlen
 
Um bei deinem Code zu bleiben und weiters da du noch am Lernen der Sprache bist, hier ein paar nützliche Tipps

Delphi-Quellcode:
function IsPrime(a: integer): Boolean;
var
  b, i: integer;
begin
  if a <= 1 then
    Result := False // Anmerkung: Result entspricht "IsPrime" (Funktionsname) und ist somit der Rückgabewert (hence result!)
  else
  begin
    b := a;
    Result := True;
    while b > 2 do // hier lag der Fehler, der dir ja schon aufgefallen ist...
    begin
      b := b - 1;
      i := a mod b;
      if i = 0 then // setzt den Rückgabewert wieder auf null (ist keine Primzahl) wenn ohne Rest teilbar
      begin
        Result := False;
        Break; // break bricht die aktuelle Schleife ab; Exit verlässt eine Function/Procedure
      end;
    end;
  end;
end;
Delphi-Quellcode:
(* Mein Senf; musst du dir nicht geben... *)

function IsPrime2( X: Integer ): Boolean;
var
  D: Integer;
begin
  {
    Die Wahrscheinlichkeit, dass bei einer Divison mit einem kleinen Divisor der Rest 0 ist, ist größer
    als bei einem großen Divisor - folglich lassen wir denn Divisor von 2 bis (x-1) steigen und nicht umgekehrt
    @Forum - Kann einer diesen Gedankenvorgang bestätigen, bin mir iwie gar nicht mehr so sicher =|
    (7 Dosen Energydrinks.. Konzentration lässt nach xD)
  }
  Result := False;
  if X > 2 then
  begin
    D := 2;
    repeat
      if X mod D = 0 then
        Exit;    // Brich die ganze Funktion ab (Rückgabewert ist False -> Siehe erste Zeile)
      inc( D );  // inc macht folgendes --> "D := D + 1" (ist eine Procedure, die eine Variable entgegen nimmt)
    until D = X;
    Result := True;
  end;
end;
MfG

Sir Rufo 15. Okt 2010 16:09

AW: Primzahlen
 
Aus Performancegründen kann man die Prüfung auf diesen Bereich einschränken
Code:
1 < n <= X div 2
denn
Code:
für {X div 2 < n < X} gilt X mod n <> 0

nachti1505 15. Okt 2010 16:41

AW: Primzahlen
 
Delphi-Quellcode:
function isPrime(a: integer): Boolean;
begin
  result := isPrimeRek(a, 2);
end;

function isPrimeRek(a, Teiler: integer): Boolean;
begin
  if (a mod Teiler = 0) then result := false
  else if (Teiler < Round(Sqrt(a)) + 1) then result := isPrimeRek(a, Teiler + 1)
  else result := true;
end;

nachti1505 15. Okt 2010 16:43

AW: Primzahlen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1055969)
Aus Performancegründen kann man die Prüfung auf diesen Bereich einschränken
Code:
1 < n <= X div 2
denn
Code:
für {X div 2 < n < X} gilt X mod n <> 0

Die Prüfung kann sgar auf
Code:
1 < n < Sqrt(X) + 1
beschränkt werden....

DeddyH 15. Okt 2010 16:43

AW: Primzahlen
 
Zitat:

Zitat von Romiox (Beitrag 1055801)
Ich weiss, es gibt hier viele Threads zu dem Thema, aber erstens habe ich so meine Probleme anderer Leute Code zu lesen (Übungssache, nehm ich an^^)
und zweitens interessiert mich eigentlich mehr woran genau mein Code krankt, weniger der eigentlich Lösungsweg ;)

Bevor das hier noch zum Wettbewerb ausartet.

Romiox 15. Okt 2010 17:26

AW: Primzahlen
 
Richtig, ich hab alles was ich wollte ;)

Vielen, vielen Dank trotzdem für alle eure Antworten, sind doch alle recht übersichtlich und nachvollziehbar,
und definitiv eine Bereicherung :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.
Seite 2 von 2     12   

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