Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Primzahlen erkennen


Mosh-Josh - So 26.02.06 13:31
Titel: Primzahlen erkennen
Da ich nächste Woche Klausur schreibe und wir erst seit wenigen Wochen mit Delphi 6.0 arbeiten, hat uns unser Lehrer ein Arbeitsblatt gegeben. Eine Aufgabe lautet: Erstelle eine Konsolenanwendung, die Primzahlen erkennt wenn du sie eingibst!
Ich habe ein bisschen herumprobiert, allerdings gibt die Konsole bei jeder ungeraden Zahl die Meldung "Primzahl" und bei jeder geraden Zahl "Keine Primzahl" aus. Kann mir jemand helfen?


Hier der Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
zahl,teiler:integer;
primzahl:boolean;

begin
  primzahl:=true; teiler:=2;
  writeln('Bitte geben sie eine Zahl ein!');
  readln(zahl);
 Repeat
   if zahl mod teiler = 0 then
   primzahl:=false; teiler:=teiler+1
 until not primzahl or primzahl;
  if primzahl then writeln('Die Zahl ist eine Primzahl!');
  if not primzahl then writeln('Die Zahl ist keine Primzahl!');
 readln;

end.


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 26.02.2006 um 13:36


GTA-Place - So 26.02.06 13:38

Kannst dir diese beiden Threads mal zu Gemüte führen:
http://www.delphi-forum.de/topic_Optimierung+einer+Primzahlfunktion_33013.html
http://www.delphi-forum.de/topic_Primfaktorzerlegung+optimieren_51842.html


MiChri - So 26.02.06 16:05

Hallo
in Zeile 12 steht bei dir

Delphi-Quelltext
1:
 until not primzahl or primzahl;                    

Das ist natülich immer wahr. Besser wäre vielleicht

Delphi-Quelltext
1:
 until not primzahl or (teiler>=zahl);                    

Gruß
Christian

PS: Optimierungen mit Wurzel oder gar Miller-Rabin lasse ich mal lieber aus


Tilo - So 26.02.06 21:43

statt

Quelltext
1:
teiler:=teiler+1;                    


ginge auch:

Quelltext
1:
inc(teiler);                    


DaRkFiRe - So 26.02.06 22:43

Ich werfe mal folgendes ein:

Sei v die zu prüfende Zahl

prim = wahr
Von i = 2 bis v/2:
Wenn (v % i = 0), dann: prim = falsch, Schleife abbrechen


GTA-Place - So 26.02.06 23:41

Es reicht schon bis sqrt(v); (Wurzel von v).


Hux - Mi 01.03.06 09:03

Hier mal eine Funktion aus dem Easy Delphi Helper, dann kannste es mit deinem Algorithmus vergleichen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Function IsPrim(zahl : Integer): boolean;
var
i: integer;
begin
  result := true;
  If zahl = 1 then
  begin
    result := false;
    exit;
  end;
  For i := 2 to (zahl div 2do
  begin
    If ((zahl mod i) = 0then
    begin
      result := false;
      exit;
    end;
  end;
end;