Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Abfrage bei Primzahltest übersprungen


Stinger47 - Sa 01.12.07 18:52
Titel: Abfrage bei Primzahltest übersprungen
Hi,
hab mal versucht einen Primzahlentest zu schreiben (der noch erweitert wird), der einen Bereich auf Primzahlen prüft.
Funktioniert soweit auch, dass einzige was noch fehlt ist die Ausnahme 1.
Warum auch immer überspringt die Überprüfung falls i = 1 ist.
Hier einmal der Code.
Zeile 28-33 wird übersprungen und füngt 1 anstatt in Listbox2 in Listbox 3 ein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer);
var
  i,k: Integer;
  FLAG: Boolean;
begin

  for I := VonZahl to BisZahl do
    begin

      FLAG    :=    TRUE;

      if not odd(i) then
        begin

          if i = 2 then
            Listbox3.Items.Add(IntToStr(i));

          Listbox1.Items.Add(IntToStr(i));
          FLAG    :=    FALSE;

        end
      else
        begin

          for k := 2 to TRUNC(i / 2do
            begin

              if i = 1 then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

              if (i mod k) = 0  then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

            end;

          if FLAG = TRUE then
            Listbox3.Items.Add(IntToStr(i));

        end;

    end;

end;


danke für antworten...:)


TGLDX - Sa 01.12.07 19:15


Delphi-Quelltext
1:
2:
3:
4:
5:
for k := 2 to TRUNC(i / 2do  
begin  
  if i = 1 then  
  begin  
  ...

Das ergibt mit i=1 folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
for k := 2 to 0 do  // TRUNC( 1 / 2) = 0
begin  
  if i = 1 then  
  begin  
  ...

Eine For-Schleife von 2 bis 0 wird nicht durchlaufen.


Stinger47 - Sa 01.12.07 19:31

hmmm ok das hab ich behobe aber die Schleifen werden nicht vollständig durchlaufen.
Habe zwei Editfelder, in denen ich VonZahl und BisZahl auslese.
die Schleife wird allerdings immer nur bis 9 durchlaufen egal wie hoch ich BisZahl setze.
Setze ich VonZahl höher als 10 dann werden immer nur ein bis zwei Zahlen eingetragen.

Hier nun der behobene Code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer);
var
  i,k: Integer;
  FLAG: Boolean;
begin

  for I := VonZahl to BisZahl do
    begin

      FLAG    :=    TRUE;

      if not odd(i) then
        begin

          if i = 2 then
            Listbox3.Items.Add(IntToStr(i));

          Listbox1.Items.Add(IntToStr(i));
          FLAG    :=    FALSE;
          //Anzahl eintragen

        end
      else
        begin

          for k := 2 to TRUNC(i / 2do
            begin

              if (i mod k) = 0  then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

            end;

          if i = 1 then
            begin
              Listbox2.Items.Add(IntToStr(i));
              FLAG    :=    FALSE;
            end;


          if FLAG = TRUE then
            Listbox3.Items.Add(IntToStr(i));

        end;

    end;

end;


TGLDX - Sa 01.12.07 19:48


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for k := 2 to TRUNC(i / 2do  
 begin  
  if (i mod k) = 0  then  
  begin  
    Listbox2.Items.Add(IntToStr(i));  
    FLAG    :=    FALSE;  
    EXIT;  
  end;

Bei i = 9 läuft die Schleife von 2 bis 4.
Wenn k = 3 , ist (i mod k) = 0
=> 9 wird zur ListBox2 hinzugefügt und dann wird die Prozedur mit exit verlassen .
Ich denke du willst nicht die Prozedur, sondern die For-Schleife verlassen,was man mit break erreicht.


Stinger47 - Sa 01.12.07 20:44

dankeschön funktioniert jetzt auch.
dachte die befehler liefen auf das selbe hinaus...wieder schlauer
danke noochmal...:)


BenBE - Sa 01.12.07 20:47

In Bezug auf das Suchen von Primzahlen empfehle ich diesen alten Faden [http://www.delphi-forum.de/viewtopic.php?t=33013].