C# :: Aufgabe #276
2 Lösungen
Ägyptische Bruchrechnung
Fortgeschrittener - C#
von hollst
- 22.12.2019 um 22:50 Uhr
Gegeben seien zwei positive Ganzzahlen Z (wie Zaehler) und N (wie Nenner) mit N > Z
und Z sei kein Teiler von N.
Der Bruch Z/N ist immer als Summe der Kehrwerte positiver Ganzzahlen (Stammbrüche) darstellbar,
wobei es meist mehrer Möglichkeiten der Darstellung gibt.
Beispiele:
5/6 = 1/2 + 1/3 = 1/2 + 1/4 + 1/12 = 1/2 + 1/4 + 1/13 + 1/156 = ...
17/39 = 1/3 + 1/10 + 1/390 = ...
Man schreibe ein Programm, das Z und N entgegennimmt und die Zahlen der Stammbrüchesumme mit den wenigsten Summanden ausgibt.
Also obere Beispiele:
Input 5 und 6, Output 2 und 3,
Input 17 und 39, Output 3, 10 und 390.
Viel Spaß.
und Z sei kein Teiler von N.
Der Bruch Z/N ist immer als Summe der Kehrwerte positiver Ganzzahlen (Stammbrüche) darstellbar,
wobei es meist mehrer Möglichkeiten der Darstellung gibt.
Beispiele:
5/6 = 1/2 + 1/3 = 1/2 + 1/4 + 1/12 = 1/2 + 1/4 + 1/13 + 1/156 = ...
17/39 = 1/3 + 1/10 + 1/390 = ...
Man schreibe ein Programm, das Z und N entgegennimmt und die Zahlen der Stammbrüchesumme mit den wenigsten Summanden ausgibt.
Also obere Beispiele:
Input 5 und 6, Output 2 und 3,
Input 17 und 39, Output 3, 10 und 390.
Viel Spaß.
Lösungen:
Hallo,
da ich ganz frisch auf der Seite bin hoffe ich, dass ich alles richtig einreiche :)
MainWindow.xaml
C#-Code
MainWindow.xaml.cs
C#-Code
da ich ganz frisch auf der Seite bin hoffe ich, dass ich alles richtig einreiche :)
MainWindow.xaml
<Window x:Class="Egypt.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:Egypt"
mc:Ignorable="d"
Title="Ägyptisches Bruchrechnen" Height="500" Width="400" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF505050" Offset="0.013"/>
<GradientStop Color="#FF434242" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
<Grid>
<Label Content="Zähler:" HorizontalAlignment="Left" Margin="27,16,0,0" VerticalAlignment="Top" Foreground="White" FontSize="15"/>
<Label Content="Nenner:" HorizontalAlignment="Left" Margin="27,51,0,0" VerticalAlignment="Top" Foreground="White" FontSize="15"/>
<TextBox x:Name="TxbInputZ" HorizontalContentAlignment="Right" HorizontalAlignment="Left" Height="23" Margin="103,23,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="60" TextChanged="InputChanged"/>
<TextBox x:Name="TxbInputN" HorizontalContentAlignment="Right" HorizontalAlignment="Left" Height="23" Margin="103,53,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="60"/>
<Button x:Name="BtnStart" Content="berechnen" HorizontalAlignment="Left" Margin="30,98,0,0" VerticalAlignment="Top" Width="133" Height="25" Click="Start"/>
<TextBlock x:Name="TbSolution" HorizontalAlignment="Left" Margin="10,158,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="299" Width="376" Foreground="White">
<TextBlock.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF606060" Offset="0"/>
<GradientStop Color="#FF454545" Offset="1"/>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
<Label Content="Ergebniss:" HorizontalAlignment="Left" Margin="10,127,0,0" VerticalAlignment="Top" Foreground="White"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
namespace Egypt
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Start(object sender, RoutedEventArgs e)
{
var originalZaehler = Convert.ToDouble(TxbInputZ.Text);
var originalNenner = Convert.ToDouble(TxbInputN.Text);
// Rechnung ist: Neuer Bruch + (Alten Bruch - Neuen Bruch)
if (originalZaehler < originalNenner)
{
TbSolution.Text += Environment.NewLine + originalZaehler + "/" + originalNenner + " =";
double kuerzerZaehler = originalNenner;
while (kuerzerZaehler > 0)
{
// Wir bilden uns den neuen Bruch
double ersterBruchZaehler = NeuerBruch(originalZaehler, originalNenner).Item1;
double ersterBruchNenner = NeuerBruch(originalZaehler, originalNenner).Item2;
// Wir bilden den Stammbruch
double stammbruchZaehler = originalZaehler / originalZaehler; ;
double stammbruchNenner = Math.Ceiling((double)originalNenner / originalZaehler);
TbSolution.Text += " " + stammbruchZaehler + "/" + stammbruchNenner;
// Wir berechnen den größten gemeinsamen Teiler
double gemeinsamerTeiler = GemeinersamerTeiler(ersterBruchNenner, originalNenner);
// Wir berechnen das kleinste gemeinsame Vielfache
double klGemeinsameVielfache = KleinsteVielfache(ersterBruchNenner, originalNenner, gemeinsamerTeiler);
// Wir berechnen die Differenzen zwischen dem alten Bruch und dem neuen Bruch
double differenzZaehler = originalZaehler * (ersterBruchNenner / gemeinsamerTeiler) - ersterBruchZaehler * (originalNenner / gemeinsamerTeiler);
// Wir versuchen den Bruch noch zu kürzen
kuerzerZaehler = Kuerzen(differenzZaehler, klGemeinsameVielfache).Item1;
double kuerzerNenner = Kuerzen(differenzZaehler, klGemeinsameVielfache).Item2;
originalZaehler = kuerzerZaehler;
originalNenner = kuerzerNenner;
if (kuerzerZaehler > 0)
TbSolution.Text += " + ";
};
}
else
TbSolution.Text += Environment.NewLine + "N ist nicht größer als Z";
}
private (double, double) NeuerBruch(double z, double n)
{
double zaehler = z;
double nenner = n;
while (nenner % zaehler != 0)
{
nenner += 1;
};
return (zaehler, nenner);
}
private double GemeinersamerTeiler(double n1, double n2)
{
double rest = 1;
while (rest > 0)
{
rest = n1 % n2;
n1 = n2;
if (rest != 0)
{
n2 = rest;
}
};
return n2;
}
private double KleinsteVielfache(double n1, double n2, double grTeiler)
{
double klVielfache = n1 * n2 / grTeiler;
return klVielfache;
}
private (double, double) Kuerzen(double z, double n)
{
for (double a = 2; a < n; a++)
{
if (n % a == 0 && z % a == 0)
{
return (z / a, n / a);
}
}
return (z, n);
}
private void InputChanged(object sender, TextChangedEventArgs e)
{
try
{
double inputs = Convert.ToDouble(((TextBox)sender).Text);
}
catch (Exception ex)
{
MessageBox.Show("Bitte keinen text eingeben und nur Zahlen-");
((TextBox)sender).Text = "0";
return;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace aufg_276
{
class Program
{
static void aegBruch(int z, int n)
{
if (z == 0 || n == 0) return;
if (n % z == 0)
{
Console.WriteLine("1/" + n / z);
return;
}
if (z % n == 0)
{
Console.WriteLine("kein echter Bruch");
return;
}
if (z > n)
{
Console.Write(z / n + " + ");
aegBruch(z % n, n);
return;
}
int n2 = n / z + 1;
Console.Write("1/" + n + " + ");
aegBruch(z * n2 - n, n * n2);
}
static void Main(string[] args)
{
Console.WriteLine("Zaehler eingeben:");
int zaehler=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Nenner eingeben:");
int nenner= Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Aegyptischer Brueche von " + zaehler + "/" + nenner + " sind\n ");
aegBruch(zaehler, nenner);
Console.ReadKey();
}
}
}
