C# :: Aufgabe #361

3 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von Nerv28 (80 Punkte) - 09.03.2021 um 11:04 Uhr
Quellcode ausblenden C#-Code

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; }
        }
    }
}

vote_ok
von Waldgeist (2270 Punkte) - 12.03.2021 um 18:43 Uhr
Hallo,

also ich schaffe es nur mit 2 Schleifen.

Hier der XAML Code für die Oberfläche

Quellcode ausblenden C#-Code
<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:

Quellcode ausblenden C#-Code
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
vote_ok
von JKooP (11680 Punkte) - 31.03.2021 um 18:10 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden 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;
}