Frage deutsch
~~~~~~~~~~~~~~~~
Wie ermittle ich, ob eine Zahl eine Happy Number (Fröhliche Zahl) ist?
Question English
~~~~~~~~~~~~~~~~
How to figure out wether a number is a Happy Number or not?
Antwort 1
~~~~~~~~~~~~~~~~
[ von Andreas Meile ("Dreael", qbasicde*dreael.ch ) im QB-Forum,
18.12.2004 ]
.
Eine Happy Number (auf deutsch "Fröhliche Zahl") ist wie folgt definiert: Man
nimmt die einzelnen Dezimalstellen der Zahl hoch 3 und addiert die einzelnen
Ergebnisse. Die resultierende Zahl unterwirft am demselben Rechengang. Wenn sich
nach einigen Wiederholungen des Rechenganges das Ergebnis den Fixpunkt erreicht,
dann handelt es sich um eine Happy Number.
Beispiel für die Startzahl 245: 2^3 + 4^3 + 5^3 = 197.
Ich habe hierfür mal einen kleinen Code angerührt:
'****************************************************************************
' HAPPYNUM.BAS = Berechnung von Happy Numbers (froehlichen Zahlen)
' ============
' Die einzelnen Dezimalstellen der Startzahl werden hoch drei genommen
' und die Ergebnisse addiert. Anschliessend fuehrt das Programm mit der
' resultierenden Zahl denselben Rechengang durch usw. Die Anzahl der
' Durchlaeufe ist waehlbar. Strebt das Ergebnis einem festen Wert zu,
dann
' ist die Startzahl eine Happy Number. Werden die Ergebnisse nach einer
Reihe
' von Durchlaeufen periodisch (sich wiederholende Zahlenreihe), dann
handelt
' es sich um eine Unhappy Number (Nichtfroehliche Zahl).
'
' (c) Andreas Meile, 18.12.2004 (Kommentar von Thomas Antoni)
'****************************************************************************
'
INPUT "Startzahl"; z&
INPUT "Anzahl Durchlaeufe"; n%
FOR i% = 1 TO n%
z1& = z&
z2& = 0&
WHILE z1& > 0&
z2& = z2& + (z1& MOD 10&) * (z1& MOD 10&) * (z1&
MOD 10&)
z1& = z1& \ 10&
WEND
PRINT z2&
z& = z2&
NEXT i%
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/happynum.bas .
Folgendes ist noch interessant: Bei Nicht-Happy Numbers (Unhappy Numbers)
ergibt sich nach einigen Rekursionen eine Periodizität => Du könntest das
Programm also dahingehend erweitern, dass es diese Periodizität erkennt und
dadurch auf eine Unhappy Number schließt. Nur wieviele Zahlen muss die
periodische Folge enthalten? Ich weiß es leider nicht.
Es ist eine hinreichende Bedingung für eine Happy Number, wenn zweimal
hintereinander dasselbe Ergebnis erscheint. Das kannst Du ebenfalls per Programm
auswerten,
Antwort 2
~~~~~~~~~~~~~~~~
[ von Thomas Antoni, 7.1.2005 ]
*** Was sind "Fröhlichen Zahlen"?
Es scheint unterschiedliche Definitionen von "Happy Numbers" zu geben. Im
Online-Lexikon Wikipedia.org fand ich z.B. die folgenden Definitionen:
*** Definition 1
Eine fröhliche Zahl ist eine natürliche Zahl, die als Ausgangswert für eine
bestimmte Iterationsvorschrift nach endlich vielen Iterationsschritten zu dem
Zahlenwert 1 führt, ähnlich dem Collatz-Problem.
*** Definition 2
Bei einer natürliche Zahl n mit der Dezimaldarstellung , wobei 0 < = ai
< = 9, werden die einzelnen Ziffern ai quadriert und addiert, d.h. es wird
berechnet. Die daraus resultierende Zahl wird genauso behandelt. Ergibt sich
irgendwann als Ergebnis eine 1, dann haben alle folgenden Zahlen ebenfalls
diesen Wert, und die Zahl wird als fröhlich bezeichnet. Die einzige Alternative
ist der Übergang in einen periodischen Zyklus.
*** Beispiele für fröhliche Zahlen
Die ersten 20 fröhlichen Zahlen sind 1 7 10 13 19 23 28 31 32 44 49 68 70 79
82 86 91 94 97 und 100.
*** Fröhliche Primzahlen
Primzahlen, die fröhlich sind, nennt man fröhliche Primzahlen.
Beeispiele:
7 13 19 23 31 79 97 103 109 139 167 193 239 263 293 313 ...
Die 91 ist eine fröhliche Pseudoprimzahl. Die Carmichael-Zahl 1729 ist das
Produkt der ersten drei fröhlichen Primzahlen.
*** Weblinks zu Fröhlichen Zahlen
- Happy Number from Math World ( http://mathworld.wolfram.com/HappyNumber.html )
- Mathews: Happy Numbers ( www.wschnei.de/digit-related-numbers/happy-numbers.html )
*** QBasic-Lösung von Thomas Antoni
Ich möchte mich mit Happy Numbers gemäß der obenstehenden Definition 2
befassen (Quadrieren mit anschließendem Addieren der Dezimalstellen). Um die
Rechenschritte durchzuführen muss man die Zahlen in ihre Dezimalstellen
zerlegen. Wie man das macht, kannst Du im Eintrag "Wie zerlege ich eine Zahl in
ihre Dezimalstellen?" nachlesen.
Mein folgendes Programm HAPYNUM2.BAS ermittelt, ob eine eingegebene Zahl eine
Fröhliche Zahl gemäß Definition 2 ist. Für die Dezimalzerlegung habe ich hierfür
im Gegensatz zu Andreas Meiles obenstehendem Programm die Methode mit STRG$
gewählt (Umwandlung der Zahl in einen String).
'****************************************************************************
' HAPYNUM2.BAS = Berechnung von Happy Numbers (froehlichen Zahlen)
' ============
' Die einzelnen Dezimalstellen der Startzahl werden quadriert und die
' Ergebnisse addiert. Anschliessend fuehrt das Programm mit
d.resultierenden
' Zahl denselben Rechengang durch usw. Strebt das Ergebnis dem Wert 1 zu,
dann
' ist die Startzahl eine Happy Number. Werden die Ergebnisse nach einer
Reihe
' von Durchlaeufen periodisch (sich wiederholende Zahlenreihe), dann
handelt
' es sich um eine Unhappy Number (Nichtfroehliche Zahl).
'
' (c) Thomas Antoni, 7.1.2005
'****************************************************************************
'
CLS
INPUT "Startzahl (max. 2 Milliarden)...: "; z&
INPUT "Schritte........................: "; n%
Erg& = z& 'Zwischenergebnis vorbesetzen
'
FOR s% = 1 TO n% 'Schleife ueber alle Schritte
ZErg& = 0 'Zwischenergebnis vorbesetzen
Zahl$ = STR$(Erg&) 'Zahl in Zeichenkette (String) umwandeln
FOR i% = 1 TO LEN(Zahl$) 'Schleife ueber alle Zeichen
ZErg& = ZErg& + (VAL(MID$(Zahl$, i%, 1))) ^ 2
'aktuelles Dezimal-Zeichen isolieren, in
'Zahlenwert ueckwandeln, quadrieren und
'aufsummieren
NEXT i%
Erg& = ZErg&
PRINT Erg&
IF Erg& = 1 THEN
PRINT z&; " ist eine Froehliche Zahl (Happy number) !!!"
SLEEP
END
END IF
NEXT s%
'
PRINT "Periodische Zwischenergebnisse? ==> Unhappy Number !!!"
SLEEP
END
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/hapynum2.bas .
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]