C++ :: Aufgabe #333
2 Lösungen
Fröhliche Zahlen (Happy Number)
Fortgeschrittener - C++
von JKooP
- 28.02.2021 um 10:24 Uhr
Von einer fröhlichen Zahl spricht man, wenn eine natürliche Ausgangszahl (Integer)
nach einer bestimmten Iterationsvorschrift am Ende den Zielwert 1 hat.
Die Iterationsvorschrift hier:
Die Summe der Quadrate aller Ziffern einer Zahl.
Wiederholen des Prozesses mit der neu entstandenen Zahl, bis am Ende
das Ergebnis entweder 1 (true) ist oder die Schleife unendlich weiterläuft (false).
Beispiel Glückliche Zahl:
Zahl 19
1² + 9² = 82
8² + 2² = 68
6² + 8² = 100
1² + 0² + 0² = 1
Beispiel unendlich:
Zahl 2
2² = 4
4² = 16
1² + 6² = 37
3² + 7² = 58
5² + 8² = 89
8² + 9² = 145
...
Aufgabe 1 (mittel):
Erstelle eine Methode/Funktion, die als Ergebnis bei einer Glücklichen Zahl den Wert true
und ansonsten false zurückgibt. Dabei können mehrere Schleifen ineinander verschachtelt werden.
Aufgabe 2 (schwieriger):
Wie Aufgabe 1, aber mit nur einer Schleife.
Viel Spaß
nach einer bestimmten Iterationsvorschrift am Ende den Zielwert 1 hat.
Die Iterationsvorschrift hier:
Die Summe der Quadrate aller Ziffern einer Zahl.
Wiederholen des Prozesses mit der neu entstandenen Zahl, bis am Ende
das Ergebnis entweder 1 (true) ist oder die Schleife unendlich weiterläuft (false).
Beispiel Glückliche Zahl:
Zahl 19
1² + 9² = 82
8² + 2² = 68
6² + 8² = 100
1² + 0² + 0² = 1
Beispiel unendlich:
Zahl 2
2² = 4
4² = 16
1² + 6² = 37
3² + 7² = 58
5² + 8² = 89
8² + 9² = 145
...
Aufgabe 1 (mittel):
Erstelle eine Methode/Funktion, die als Ergebnis bei einer Glücklichen Zahl den Wert true
und ansonsten false zurückgibt. Dabei können mehrere Schleifen ineinander verschachtelt werden.
Aufgabe 2 (schwieriger):
Wie Aufgabe 1, aber mit nur einer Schleife.
Viel Spaß
Lösungen:
#include <iostream>
#include <math.h>
bool isHappyNumber(int &num, int maxTries = 10);
int main() {
int number;
std::cout << "Is your number a happy number??.\nLet's find out: ";
std::cin >> number;
std::cout << number;
switch (isHappyNumber(number)) {
case 1:
std::cout << " is a happy number.";
break;
default:
std::cout << " is not a happy number.";
break;
}
return 0;
}
bool isHappyNumber(int &num, int maxTries)
{
std::string str_num = std::to_string(num);
int result = 0;
for (auto val: str_num) {
int tmp = std::atoi(&val);
result += pow(tmp, 2);
}
if (result == 1)
{
return true;
} else
{
if (maxTries == 1)
{
return false;
} else
{
return isHappyNumber(result, --maxTries);
}
}
}
C++ 17
C-Code
#include <iostream>
#include <unordered_set>
int digit_square_sum(int n)
{
int result = 0;
while (n > 0)
{
result += (int)pow(n % 10, 2);
n /= 10;
}
return result;
}
bool is_happy(int n)
{
std::unordered_set<int> us{};
while (true)
{
n = digit_square_sum(n);
if (n == 1) return true;
else if (us.find(n) != us.end()) return false;
us.insert(n);
}
}
int main()
{
std::cout << (is_happy(19) ? "wahr" : "falsch") << std::endl;
}
