Mithilfe solcher Aufgaben kannst du üben eigenen Code zu schreiben und danach natürlich die Lösung anschauen ob die Aufgabe richtig verstanden wurde . Wichtig hierbei ist natürlich, dass es nicht die richtige Lösung gibt und die Lösung von mir lediglich dazu dient eine bereitzustellen und Anreize zu bieten, sollte man mal nicht weiter kommen.
Ziel ist es ein Programm zu schreiben, welches ermitteln soll, ob eine Zahl eine Münchhausener Zahl ist. Eine Münchhausener Zahl ist eine Zahl, welche aus der Summe ihrer Ziffern exponenziert mit sich selbst gebildet werden kann. Beispiel: 3435
\begin{eqnarray} 3435 &=& 3^3 + 4^4 + 3^3 + 5^5 \\ 3435 &=& 27 + 256 +27 + 3125 \\ 3435 &=& 3435 \\ \end{eqnarray}
Solltest du starke Probleme mit der Aufgabe haben, lies dir bitte nochmal die unten verlinkten Artikel durch. Zum Ende des Artikels
Um eine Zahl zu prüfen, benötigen wir natürlich erstmal eine Zahl. Diese Zahl speicher ich mir in einer Variable ab.
1zahl := 3435
Nun brauchen wir noch eine Zahl um das Ergebnis zu speichern und nachher mit der Zahl abzugleichen.
1var erg int
Nun durchlaufen wir, die zu prüfende Zahl, Ziffer für Ziffer. Das heißt wir schreiben eine Schleife, die solange läuft wie unsere temporäre Zahl größer ist als 0 und fangen bei unserer Prüfzahl an. Für jeden Schleifendurchlauf teilen wir unsere temporäre Zahl immer durch 10.
1zahl := 3435
2var erg int
3for copyZahl := zahl; copyZahl > 0; copyZahl /= 10 {
4}
Damit erreichen wir, dass nach jedem Schleifendurchlauf die letzte Zahl weg ist bis Sie letzlich 0 ist und wir mit der Schleife aufhören können. Wir müssen uns nur noch überlege nwie wir an jede einzelne Ziffer kommen bevor Sie gelöscht wird. Das ganze können wir mit dem Modulo (%) Operator machen. Jede Ziffer mit einer Ganzzahligen Division durch 10 ergibt nämlich genau eben diese Ziffer.
1zahl := 3435
2var erg int
3for copyZahl := zahl; copyZahl > 0; copyZahl /= 10 {
4 letzteZahl := copyZahl % 10
5}
Mittels Math.Pow können wir nun auch für jede einzelne Zahl exponiert mit sich selber berechnen. Leider erwartet die Funktion in Golang ein int64, weswegen wir die letzteZahl Variable in genau diesen konvertieren.
1func math.Pow(x float64, y float64) float64
2Pow liefer als Ergebis eine Potenzierung wobei X die Basis ist und y der exponent
Damit kann man sich den Teil berechnen für jede Ziffer und das Ergebnis immer weiter zählen lassen (aufaddieren)
1zahl := 3435
2var erg int
3for copyZahl := zahl; copyZahl > 0; copyZahl /= 10 {
4 letzteZahl := float64(copyZahl % 10)
5
6 erg = erg + int(math.Pow(letzteZahl, letzteZahl))
7}
Zum Schluss brauchen wir nur noch einen Vergleich ob die Zahl nun die gleiche ist wie unser Ergebnis:
1if erg == zahl {
2 fmt.Println(zahl, "Ist eine Münchhausen-Zahl")
3} else {
4 fmt.Println(zahl, " ist keine Münchhausener-Zahl")
5}
Der Verlgeich findet natürlich nach der Schleife statt
1package main
2
3import (
4 "fmt"
5 "math"
6)
7
8func main() {
9 zahl := 3435
10 var erg int
11 for copyZahl := zahl; copyZahl > 0; copyZahl /= 10 {
12 erg = erg + int(math.Pow(float64(copyZahl%10), float64(copyZahl%10)))
13 }
14
15 if erg == zahl {
16 fmt.Println(zahl, "Ist eine Münchhausen-Zahl")
17 } else {
18 fmt.Println(zahl, " ist keine Münchhausener-Zahl")
19 }
20}