C# :: Aufgabe #361
5 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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Fröhliche_Zahlen
{
class Program
{
static void Main(string[] args)
{
int iEingabe = 0;
bool bTemp = false;
while (bTemp == false)
{
Console.WriteLine("Bitte geben Sie eine Zahl ein.");
if (!int.TryParse(Console.ReadLine(), out iEingabe)) { Console.Clear(); Console.WriteLine("Bitte geben Sie nur Zahlen ein!"); } else { bTemp = true; }
}
if (Fröhliche_Zahl(iEingabe) == true) { Console.WriteLine($"{iEingabe} ist eine Fröhliche Zahl!"); }
else { Console.WriteLine($"{iEingabe} ist keine Fröhliche Zahl."); }
Console.ReadLine();
}
public static bool Fröhliche_Zahl(int iEingabe)
{
int iZähler = 0;
double dTemp = 0, dErgebnis = 0;
string sEingabe = "";
sEingabe = iEingabe.ToString();
while (dErgebnis != 1 && iZähler < 1000)
{
if (iZähler >= 50 && dErgebnis == 4) { break; }
dErgebnis = 0;
foreach (char c in sEingabe)
{
dTemp = int.Parse(c.ToString());
dErgebnis += Math.Pow(dTemp, 2);
}
Console.WriteLine(dErgebnis);
sEingabe = dErgebnis.ToString();
iZähler++;
}
if (iZähler >= 1000 || dErgebnis == 4) { return false; }
else { return true; }
}
}
}
Hallo,
also ich schaffe es nur mit 2 Schleifen.
Hier der XAML Code für die Oberfläche
C#-Code
und hier der Code für die Logik:
C#-Code
grüße
Waldgeist
also ich schaffe es nur mit 2 Schleifen.
Hier der XAML Code für die Oberfläche
<Window x:Class="_361_Happy_Numbers.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:_361_Happy_Numbers"
mc:Ignorable="d"
Title="Happy Numbers / Fröhliche Zahlen" Height="300" Width="650">
<Grid>
<Label Content="Dieses Programm ermittelt ob ihre eingegebene Zahl eine fröhliche Zahl ist !!" HorizontalAlignment="Center" Height="48" Margin="0,22,0,0" VerticalAlignment="Top" Width="800" HorizontalContentAlignment="Center" FontWeight="Bold" FontSize="16" />
<TextBox x:Name="tb_eingabe" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Height="40" Margin="0,70,0,0" Text="1" TextWrapping="Wrap" VerticalAlignment="Top" Width="75" />
<Button x:Name="button_prüfen" Content="prüfen" HorizontalAlignment="Center" Height="40" VerticalAlignment="Top" Width="75" Click="button_prüfen_Click" Margin="0,140,0,0" />
</Grid>
</Window>
und hier der Code für die Logik:
using System;
using System.Windows;
namespace _361_Happy_Numbers
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_prüfen_Click(object sender, RoutedEventArgs e)
{
string zahlstring = tb_eingabe.Text;
int laenge = zahlstring.Length;
double wert = 0;
int abruch = 0;
do
{
abruch++;
wert = Rechnen(zahlstring);
zahlstring = wert.ToString();
} while (wert != 1 & abruch < 100);
if (wert == 1)
{
MessageBox.Show("Die Zahl ist GLÜCKLICH !");
}
else
{
MessageBox.Show("Leider ist die Zahl nicht glücklich");
}
}
private double Rechnen(string Daten)
{
double wert = 0;
foreach (var stelle in Daten)
{
double zahl = stelle - 48;
wert += Math.Pow(zahl, 2);
}
return wert;
}
}
}
grüße
Waldgeist
NET 5.x; C# 9.x; VS-2019
C#-Code
using System;
using System.Collections.Generic;
Console.WriteLine(IsHappy(19));
static bool IsHappy(int n)
{
var hs = new HashSet<int>();
while (true)
{
n = DigitSquareSum(n);
if (n == 1) return true;
else if (hs.Contains(n)) return false;
hs.Add(n);
}
}
static int DigitSquareSum(int n)
{
int result = 0;
while (n > 0)
{
result += (int)Math.Pow(n % 10, 2);
n /= 10;
}
return result;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08Uebungen
{
class GluecklicheZahl
{
public static void Raten()
{
string userEingabeString = "";
int userEingabeInt = 0;
do // Die do-While Schleife ist optional und kann auch mit einem If-Statement gelöst werden
{
Console.Write("Geb eine Zahl ein: ");
Console.Clear(); Console.WriteLine("Du darfst nur Zahlen eingeben!");
} while (!int.TryParse(userEingabeString = Console.ReadLine(), out userEingabeInt)); // Prüft ob die userEingabe
int zaehler = 0; // Zähler um eine unendliche Schleife zu unterbrechen
int zwischenErgebnis = 0;
do // Hauptschleife
{
zwischenErgebnis = 0; // Setzt das Ergebnis bei jedem Schleifendurchgang wieder auf 0 zurück
int[] intArray = new int[userEingabeString.Length]; // Erstellt ein Int Array mit der Länge der eingegebenen Zahl
for (int i = 0; i < userEingabeString.Length; i++) // Ruft jede Stelle der userEingabe auf...
{
intArray[i] = Convert.ToInt32(userEingabeString[i].ToString()); // ..macht zuerst aus dem Char einen String,
// dann daraus eine Int und legt sie einzeln
// in das intArray ab
zwischenErgebnis += (intArray[i] * intArray[i]); // Multipliziert jede Zahl im Array mit sich selbst und addiert diese
// dann als Ergebnis
}
zaehler++; // Zählt den Zähler um eins hoch
userEingabeString = zwischenErgebnis.ToString(); // Überschreibt die userEingabe mit dem Ergebnis für den nächsten Schleifendurchlauf
} while (zwischenErgebnis != 1 && zaehler < 1000); // Wenn das Ergebnis nicht 1 ist und der Zähler unter 1000 ist läuft die Schleife weiter
if (zaehler >= 1000)
{
Console.WriteLine($"\n\t{userEingabeInt} ist keine Glückliche Zahl!");
}
else
{
Console.WriteLine($"\n\t{userEingabeInt} ist eine Glückliche Zahl!");
}
}
}
}
namespace FröhlicheZahl
{
class Program
{
public static bool istFroehlich(int z)
{
bool ist = false;
HashSet<int> Summen = new HashSet<int>();
while (Summen.Add(z))
{
int s = 0;
while(z > 0)
{
s += (int)Math.Pow(z % 10,2);
z /= 10;
}
z = s;
}
if (z == 1)ist = true;
return ist;
}
static void Main(string[] args)
{
Console.WriteLine(istFroehlich(7)); //true
Console.WriteLine(istFroehlich(11));//false
Console.ReadKey();
}
}
}
