C# :: Aufgabe #287
3 Lösungen
Die Collatz-Sequenz (3n+1)
Anfänger - C#
von DragStar
- 23.03.2020 um 09:34 Uhr
Schreibe ein Programm, welches die Eingabe einer Zahl anfordert und dann von dieser Zahl die Collatz-Sequenz ausgibt.
Lösungen:
Hallo,
hier meine Version. Das Projekt findet Ihr als ZIP Datei im Anhang.
C#-Code
Hier der XAML:
C#-Code
hier meine Version. Das Projekt findet Ihr als ZIP Datei im Anhang.
using System;
using System.Windows;
namespace Collatz_Reihe
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void rechen_Click(object sender, RoutedEventArgs e)
{
{
ulong n = Convert.ToUInt64(eingabebox.Text);
string ausgabe = n.ToString() + " ";
while (n > 1)
{
if (n % 2 == 0)
{
n = n / 2;
ausgabe = ausgabe + n.ToString() + " ";
}
else
{
n = 3 * n + 1;
ausgabe = ausgabe + n.ToString() + " ";
}
}
ausgabebox.Text = ausgabe;
}
}
}
}
Hier der XAML:
<Window x:Class="Collatz_Reihe.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:Collatz_Reihe"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="450">
<Grid>
<Label Content="Program zur Ermittlung der Collatz-Reihe." HorizontalAlignment="Left" Height="39" Margin="20,10,0,0" VerticalAlignment="Top" Width="751" />
<Label Content="Bitte geben Sie eine natürliche Zahl größer 0 ein (n>0)." HorizontalAlignment="Left" Height="55" Margin="20,54,0,0" VerticalAlignment="Top" Width="751" />
<TextBox x:Name="eingabebox" HorizontalAlignment="Left" Height="28" Margin="338,54,0,0" Text="1" TextWrapping="Wrap" VerticalAlignment="Top" Width="83" TextAlignment="Left" />
<TextBox x:Name="ausgabebox" HorizontalAlignment="Left" Height="132" TextWrapping="Wrap" VerticalAlignment="Top" Width="398" Margin="23,236,0,0" />
<Label Content="Hier wird die Collatz-Reihe ausgegeben:" HorizontalAlignment="Left" Height="37" Margin="23,180,0,0" VerticalAlignment="Top" Width="398" />
<Button x:Name="rechen" Content="Berechne" HorizontalAlignment="Left" Height="60" Margin="23,109,0,0" VerticalAlignment="Top" Width="398" Click="rechen_Click" />
</Grid>
</Window>
NET Core 3.x
C#-Code
using System;
using System.Collections.Generic;
namespace CS_Aufage_287_Collatz
{
class Program
{
static void Main(string[] args)
{
var c = Collatz(19);
Console.WriteLine(string.Join(" | ", c));
Console.WriteLine();
CollatzR(19);
}
// Iterativ (Zahlen von 1 ...):
public static IEnumerable<int> Collatz(int n)
{
// Bedingung 1: n > 0
if (n < 1)
yield break;
// Startwert an Collection übergeben
yield return n;
do
{
// Bedingung 2: n ist gerade => n/2
if (n % 2 == 0)
n /= 2;
// Bedingung 3: n ist ungerade => 3n+1
else
n = 3 * n + 1;
// Wert an Collection übergeben
yield return n;
} while (n > 1);
}
// Rekursiv (Zahlen größer 1):
public static void CollatzR(int n)
{
Console.Write($"{n} | ");
if (n > 1)
{
if (n % 2 == 0)
CollatzR(n / 2);
else
CollatzR(3 * n + 1);
}
}
}
}
using System;
namespace CollatzProblem
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Geben Sie eine Zahl ein.");
int Eingabe = Convert.ToInt32(Console.ReadLine());
bool Gerade(int zahl) //Kontrolle ob die Zahl gerade ist
{
return Eingabe % 2 == 0;
}
while (Eingabe != 1) //So lange die letze Zahl nicht berechnet wurde, also 1
{
Console.Write("{0}, ", Eingabe);
if(Gerade(Eingabe)) //Wenn die Zahl gerade ist
{
Eingabe = Eingabe / 2;
}
else //Ansonsten
{
Eingabe = 3 * Eingabe + 1;
}
}
Console.Write(Eingabe); //Die letzte 1 ausgeben
Console.ReadKey();
}
}
}
