AGB  ·  Datenschutz  ·  Impressum  







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

Collatz Problem

Ein Thema von lasagne0504 · begonnen am 9. Jul 2013 · letzter Beitrag vom 10. Jul 2013
Antwort Antwort
lasagne0504

Registriert seit: 9. Jul 2013
2 Beiträge
 
#1

Collatz Problem

  Alt 9. Jul 2013, 21:50
Hallo,

seit einiger Zeit Programmiere ich jetzt in Delphi, ich bin neu im Forum und habe jetzt mein erstes Problem .
Und zwar programmiere ich gerade ein Programm, welches mit einer Zahl nach dem Algorithmus des Collatz-Problemes verfährt (http://de.wikipedia.org/wiki/Collatz-Problem).
So sieht mein Quellcode aus:

var x,z:integer;


begin
x:=strtoint(edit1.Text);
z:=0;
if (x=0) or (x<0) then begin
showmessage('Die Zahl muss mindestens 1 sein!');
end else begin
while (x>1) do begin
if (x mod 2=0) then begin
x:= x div 2;
z:=z+1;
end else begin
x:=x*3+1;
z:=z+1;
end;
label1.Caption:='Nach '+inttostr(z)+' Schritten kommt 1 heraus.';
end;

end;


end;


Das Programm funktioniert mit (fast) alle Zahlen, die man eingibt, zumindest kam bei jeder Stichprobe das richtige Ergebnis raus. Es funktioniert aber wie gesagt nur bei fast allen Zahlen, bei der Zahl 670617279 funktioniert es nicht (das ist angeblich die Zahl unter einer Milliarde, bei der am meisten Schritte erforderlich sind). Es wird angezeigt, das nur 3 Schritte erforderlich wären, um auf eins zu kommen, wobei es eigentlich 986 sein müssten.
Ich kann mir das nicht erklären, habt Ihr eine Idee?
Vielen Dank
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Collatz Problem

  Alt 9. Jul 2013, 22:27
Hallo,

und herzlich Willkommen in der DP.

Mit dem Startwert 670617279 ergibt sich folgende Folge: 670617279, 2011851838, 1005925919, -1277189538
Das Ergebnis 3 * 1005925919 + 1 ist größer als der maximale Integerbreich von -2147483648..2147483647. Deshalb wird das Produkt negativ; also ist Deine Bedingung der while-Schleife nicht mehr erfüllt (nach drei Schritten).

Du kannst es mal mit
Delphi-Quellcode:
var
  x : Int64;
  z : Cardinal;
versuchen. Damit hat es aber auch irgendwann ein Ende.

BTW: Bitte nimm in Zunkunft die Delphi-Tags für Code (Helmsymbol klicken und Deinem Code zwischen die Tags setzen).

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#3

AW: Collatz Problem

  Alt 9. Jul 2013, 22:35
Ich vermute mal, das der Zahlenbereich Integer zu klein ist für die Zahl 670617279

670617279 * 3 = 2011851837
+1 = 2011851838 -> gerade Zahl noch im Bereich Longint
2011851838 / 2 = 1005925919 -> ungerade Zahl noch im Bereich Longint
1005925919 * 3 = 3017777757 -> nicht mehr im Bereich Longint
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

AW: Collatz Problem

  Alt 9. Jul 2013, 23:05
Ich habe gerade mal mit diesem Quelltext getestet und bei der Zahl kommt ein Ergebnis bei raus :
Delphi-Quellcode:
procedure TForm13.Btn_1Click(Sender: TObject);
var
  x, z : Int64;
begin
  if TryStrToInt64(edit1.Text, x) then
    x := strtoint(edit1.Text)
  else
    x := 0;
  z := 0;
  if (x = 0) or (x < 0) then
    showmessage('Die Zahl muss mindestens 1 sein!')
  else
  begin
    while (x>1) do
    begin
      if (x mod 2 = 0) then
      begin
        x:= x div 2;
        Inc(z);
      end
      else
      begin
        x := x * 3 + 1;
        Inc(z);
      end;
      label1.Caption := 'Nach ' + inttostr(z) + ' Schritten kommt 1 heraus.';
    end;
  end;
end;
Und habe mir erlaubt Deinen Quelltext noch ein wenig zu verbessern.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
lasagne0504

Registriert seit: 9. Jul 2013
2 Beiträge
 
#5

AW: Collatz Problem

  Alt 9. Jul 2013, 23:33
Ah ich dachte immer dass Delphi eine Fehlermeldung ausgibt wenn eine Zahl zu groß für eine Integer-Variabel ist. Aber dann ist das Problem ja geklärt, wenn ich int64 benutze klappt das auch.
Danke
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Collatz Problem

  Alt 10. Jul 2013, 10:04
Ah ich dachte immer dass Delphi eine Fehlermeldung ausgibt wenn eine Zahl zu groß für eine Integer-Variabel ist.
Das dachte ich auch lange. Leider ist das in der Debug-Fassung nicht die Standard-Einstellung, finde ich auch doof. Du kannst (und solltest?) es in der Debug-Fassung unter Delphi-Compiler->Compilieren->Laufzeitfehler wieder aktivieren (siehe Bild)
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Collatz Problem

  Alt 10. Jul 2013, 10:12
Auf dem Bild ist die Bereichsprüfung fokussiert, die Überlaufprüfung befindet sich 2 Zeilen tiefer
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Collatz Problem

  Alt 10. Jul 2013, 10:21
Natürlich, ich hatte noch nicht einmal bewusst etwas angewählt, war immerhin schon nahe dran
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Collatz Problem

  Alt 10. Jul 2013, 10:37
Ist ja auch kein Beinbruch, die Hilfe sagt sowieso:
Zitat:
Der Schalter $Q wird normalerweise zusammen mit dem Schalter $R eingesetzt, der die Erzeugung von Bereichsprüfungscode aktiviert bzw. deaktiviert. Die Aktivierung der Überlaufprüfung vergrößert und verlangsamt ein Programm. Die aktivierte Überlaufsprüfung verlangsamt und vergrößert Ihr Programm. Sie sollten {$Q+} daher nur für die Fehlersuche verwenden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Collatz Problem

  Alt 10. Jul 2013, 10:38
Vereinfacht sieht der Code so aus:
Delphi-Quellcode:
procedure TForm13.Btn_1Click(Sender: TObject);
var
  x : Int64;
  count : Integer;
begin
  x := StrToInt(edit1.Text);
  if x < 1 then
    raise Exception.Create('Die Zahl muss >= 1 sein!');
  count := 0;
  while (x>1) do
  begin
    if x mod 2 = 0 then
      x:= x div 2
    else
      x := x * 3 + 1;
    Inc(count);
  end;
  label1.Caption := 'Nach ' + inttostr(count) + ' Schritten kommt 1 heraus.';
end;
fork me on Github
  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 15:29 Uhr.
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