Autor |
Beitrag |
Mashalla
      
Beiträge: 48
Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
|
Verfasst: Sa 12.07.08 15:30
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:
| function TMainForm.Get_Number: Integer; var Number_Counter: Integer; Divisor_Counter: Integer; Continue: Boolean;
begin Result := 0; Continue := true;
for Number_Counter := 2520 to 2000000000 do begin for Divisor_Counter := 2 to 20 do begin if Continue = true then begin if Number_Counter mod Divisor_Counter = 0 then Continue := true else break; end; end; if (Divisor_Counter = 20) then begin Result := Number_Counter; exit; end; end; end; |
Die obige Funktion soll die kleinste Zahl ausgeben, die alle Teiler von 1 bis 20 beinhaltet. Jetzt bin ich allerdings mit der Range schon knapp unter der Integer Grenze angekommen und die Funktion gibt mir immer "0" zurück. Liegt ein Fehler in der Funktion vor oder ist die Zahl wirklich so riesig?
PS: Falls ihr testet, rechnet mit Laufzeiten um 30 Sekunden bei obigen Grenzen 
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 12.07.08 15:44
Die Funktion ist falsch.
Wenn ich mich nicht verrechnet habe, müsste 232.792.560 die gesuchte Zahl sein. Achte mal auf die Warnungen, die der Compiler so ausgibt.
Und: das kleinste gemeinsame Vielfache lässt sich effizienter ausrechnen.
_________________ We are, we were and will not be.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Sa 12.07.08 15:45
Schalte mal die Compiler-Warnungen an, dann sagt Dir Delphi schon, was faul ist....
_________________ Na denn, dann. Bis dann, denn.
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Sa 12.07.08 15:51
Gausi hat folgendes geschrieben: | Wenn ich mich nicht verrechnet habe, müsste 232.792.560 die gesuchte Zahl sein. |
Hab ich auch  .
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 12.07.08 16:06
Hi,
Über ihre Primfaktorzerlegung kommst du ja an die Zahl: Sie muss alle Primfaktoren ihrer Teiler enthalten.
Bilde mal die Primfaktorzerlegungen aller Zahlen bis 20. Nun suchst du für jede Primzahl das häufigste Vorkommen und schreibst es heraus; das sind: 2^4(die zwei kommt vier Mal vor ->2*2*2*2 = 16)
3^3
5^1
7^1
11^1
13^1
17^1
19^1 Somit ist die gesuchte Zahl das Produkt davon und damit (2^4) * (3^3) * 5 * 7 * 11 * 13 * 17 * 19.
Wenn du nun dazu ein Programm schreiben willst, müsstest du das isolieren der Primzahlen nurnoch in einen Algorithmus packen und am Ende das Produkt der Funde bilden.
Edit: Mit dem Windows-Taschenrechner komme ich dann auf Gausis Ergebnis  .
Edit2: Du solltest dir abgewöhnen, bei jedem begin-Block doppelt(4 Leerzeichen) einzurücken; so kommst du schnell an den Rand und machst den Quelltext unleserlich. Auch würde ich garnicht bei jedem begin zwei Zeilenumbrüche machen:
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:
| function TMainForm.Get_Number: Integer; var Number_Counter: Integer; Divisor_Counter: Integer; Continue: Boolean; begin Result := 0; Continue := true;
for Number_Counter := 2520 to 2000000000 do begin for Divisor_Counter := 2 to 20 do begin if Continue = true then begin if Number_Counter mod Divisor_Counter = 0 then Continue := true else break; end; end; if (Divisor_Counter = 20) then begin Result := Number_Counter; exit; end; end; end; |
Zum Highlight: www.delphi-forum.de/viewtopic.php?t=83487
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Sa 12.07.08 16:22, insgesamt 6-mal bearbeitet
|
|
Mashalla 
      
Beiträge: 48
Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
|
Verfasst: Sa 12.07.08 16:08
Öhm...die sind eigentlich alle an und der Compiler sagt mir überhaupt nix ?!?
Projekt -> Optionen -> Compiler-Meldungen überall Haken drinne...gibts sonst noch n Menu zum Einstellen?
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 12.07.08 16:13
Hm, bei mir spuckt der irgendwie auch keine aus...er sollte aber.
Denn: du greifst nach der for-Schleife auf die Schleifenvariable (Divisor_Counter) zu. Das gibt normalerweise eine Warnung, da der Wert nach der Schleife undefiniert ist oder sein kann. Mach mal eine While-Schleife draus.
Außerdem: Welchen Sinn hat Continue? Das ist immer True - da musst du an der Programmlogik noch was tüfteln. 
_________________ We are, we were and will not be.
|
|
Mashalla 
      
Beiträge: 48
Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
|
Verfasst: Sa 12.07.08 17:24
Meh...bin ich vor lauter Hatz mal wieder nicht richtig an die Sache rangegangen *gg* Danke für den Lösungsansatz
@ Gausi:
Joa...müsste wirklich da sein. Ich meine, die Meldung auch am Anfang gehabt zu haben, jedoch wüsst ich jetzt nicht, warum sie nicht mehr da ist 
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 12.07.08 22:12
Hidden hat folgendes geschrieben: | Hi,
Über ihre Primfaktorzerlegung kommst du ja an die Zahl: Sie muss alle Primfaktoren ihrer Teiler enthalten.
|
Klar, war auch mein erster Gedanke, und bei 1 - 20 geht das in ein paar Minuten mit Taschenrechner oder sogar ganz ohne Hilfe (ein Blatt Papier braucht man schon). Aber eine Schleife, die millardenmal durchlaufen wird, ist einfach viel geiler...
Gruss Reinhard
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Sa 12.07.08 22:25
Reinhard Kern hat folgendes geschrieben: | Hidden hat folgendes geschrieben: | Hi,
Über ihre Primfaktorzerlegung kommst du ja an die Zahl: Sie muss alle Primfaktoren ihrer Teiler enthalten.
|
Klar, war auch mein erster Gedanke, und bei 1 - 20 geht das in ein paar Minuten mit Taschenrechner oder sogar ganz ohne Hilfe (ein Blatt Papier braucht man schon). Aber eine Schleife, die millardenmal durchlaufen wird, ist einfach viel geiler...
Gruss Reinhard |
Mann, du bist wirklich noch ein echter Programmierer von altem Schrot und Korn.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 12.07.08 22:53
Timosch hat folgendes geschrieben: |
Mann, du bist wirklich noch ein echter Programmierer von altem Schrot und Korn. |
imho war ziemlich beißender Sarkasmus 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Mashalla 
      
Beiträge: 48
Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
|
Verfasst: So 13.07.08 01:16
Ich danke euch fürs Helfen, evtl komm ich morgen mit dem nächsten Problem vorbei
@ Reinhard:
Gruß übrigens mit "ß", wenn schon groß rausreden (-schreiben), dann bitte richtig...
|
|