;Befreundete Zahlen ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ;"Befreundet nennt man Paare von Zahlen, welche die Summe der Teiler der jeweils anderen Zahl darstellen." ;(Pythagoras) ; ;Beispiel: ;Die Teiler von 220 sind 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110, ihre Summe 284. Die Teiler von 284 ;wiederum sind 1, 2, 4, 71 und 142, ihre Summe ist 220. ; ;Es gibt auch ein Quartett von befreundeten Zahlen. Das sind die folgenden: ;1.264.460, 1.547.860, 1.727.636, 1.305.184 ;"Die Summe der Teiler der ersten Zahl ist gleich der zweiten Zahl, die Teiler der zweiten wiederum ;addieren sich zur dritten Zahl, dir Teiler der dritten summieren sich zur vierten, und die Teiler ;der vierten Zahl ergeben in der Summe schließlich wieder die erste Zahl." ; ;Dieses Programm errechnet durch Ausprobieren, bei welcher Zahl solch eine Freundschaft mit einer ;anderen auftritt. Dabei kann man mit der Konstanten #Maxkette angeben über wie viele Zahlen sich ;diese Freundschaft erstreckt. ;Mit Summe(0) = ? (direkt vor der Repeat-Schleife) kann man angeben, bei welcher Zahl begonnen werden ;soll. Setzt man #Maxkette = 4 und Summe(0) = 1264460 so erhält man das oben genannte Quartett. ; ;Tipp: Probieren sie mal #Maxkette = 28 und Summe(0) = 14316. Dann sehen sie die bisher längste ; Freundschaft im Land der befreundeten Zahlen, die bekannt ist. Vielleicht gibt es aber auch noch ; längere Ketten. ;-- Fenster oeffnen #Breite = 600 #Hoehe = 300 If OpenWindow(0, (GetSystemMetrics_(#SM_CXSCREEN) - #Breite) / 2, (GetSystemMetrics_(#SM_CYSCREEN) - #Hoehe) / 2, #Breite, #Hoehe, #PB_Window_SystemMenu, "Befreundete Zahlen") = 0 End EndIf ;-- Gadgetaufbau #Top = 5 #Left = 5 #Height = 16 #TextWidth = 100 #ButtonWidth = 100 #ButtonHeight = 24 If CreateGadgetList(WindowID()) ListViewGadget(0, #Left, #Top, #Breite - (#Left * 2), #Hoehe - (#Top * 3) - #Height) TextGadget(1, #Left, #Hoehe - #Top - #Height, #TextWidth, #Height, "Zahl:") TextGadget(2, (#Left * 2) + #TextWidth, #Hoehe - #Top - #Height, #TextWidth, #Height, "Index in Kette:") Else End EndIf ;-- Deklarierungen #MaxKette = 2 Structure FreundSt No.l[#MaxKette - 1] EndStructure Dim Summe.l(#MaxKette) NewList Freund.FreundSt() ;-- Hauptschleife Summe(0) = 0 Repeat OK = 1 ;Wenn man SetGadgetText hier herausnimmt, wird der Algorhythmus etwas schneller laufen ; If Summe(0) - Summe(0) / 10 * 10 = 0 : ;SetGadgetText(1, "Zahl: " + Str(Summe(0))); : EndIf For No = 1 To #MaxKette ;Entfernt vor allem dieses SetGadgetText, wenn ihr Geschwindigkeit haben wollt ;SetGadgetText(2, "Index in Kette: " + Str(No) + "/" + Str(#Maxkette)) Summe(No) = 0 For a.l = 1 To Summe(No - 1) - 1 If ((Summe(No - 1) / a) * a) = Summe(No - 1) : Summe(No) + a : EndIf Next If Summe(No) = Summe(0) And No < #MaxKette : OK = 0 : EndIf Next If Summe(#MaxKette) = Summe(0) And OK = 1 AddElement(Freund()) String.s = "" For No = 0 To #MaxKette - 1 Freund()\No[No] = Summe(No) If No > 0 : String = String + ", " : EndIf String = String + Str(Summe(No)) Next AddGadgetItem(0, -1, String) EndIf Summe(0) + 1 Until WindowEvent() = #WM_Close ; ExecutableFormat=Windows ; Executable=C:\Programme\PureBasic\Programme\Befreundete Zahlen.exe ; DisableDebugger ; EOF