AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Primzahlen

Ein Thema von Romiox · begonnen am 14. Okt 2010 · letzter Beitrag vom 15. Okt 2010
Antwort Antwort
Romiox

Registriert seit: 14. Okt 2010
Ort: Ruhrpott
57 Beiträge
 
#1

AW: Primzahlen

  Alt 15. Okt 2010, 12:07
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

Hmm, :headdesk: gibts nicht?
Meinst du ?
Noe, schon Desk. Aber tuts genauso :>
Janis F.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Primzahlen

  Alt 15. Okt 2010, 15:29
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (15. Okt 2010 um 15:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Primzahlen

  Alt 15. Okt 2010, 16:09
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (15. Okt 2010 um 16:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Primzahlen

  Alt 15. Okt 2010, 16:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Primzahlen

  Alt 15. Okt 2010, 16:43
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....
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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