C# :: Aufgabe #165 :: Lösung #1
4 Lösungen

#165
Existiert die Kaprekar-Konstante?
Anfänger - C#
von hollst
- 23.02.2017 um 13:29 Uhr
Man weise numerisch nach, ob die Behauptung des indischen Mathematikers Kaprekar richtig ist.
Kaprekar hat folgendes behauptet (1949):
1.) Man nehme eine vierstellige Dezimalzahl D, wobei nicht alle vier Stellen identisch sein dürfen
(also 1111, 2222 etc. sind nicht erlaubt, aber z. B. 0001 ist erlaubt).
2.) D überführe man in zwei Zahle D1 und D2, indem bei D1 die Digits in absteigender und bei D2 in aufsteigender Reihenfolge
angeordnet werden (also z. B. D = 1724 -> D1 = 7421 und D2 = 1247; oder D = 1 -> D1 = 1000 und D2 = 1).
3.) Man subtrahiere nun D2 von D1; mit dem Ergebnis (Dneu = D1 - D2) wiederhole man Pkt. 2 durch Ersetzen von D durch Dneu solange,
bis sich nichts mehr ändert.
Die unglaubliche Behauptung ist, dass bei diesem Algorithmus stets das gleiche Ergebnis herauskommt (die sogenannte Kaprekar-Konstante),
egal, mit welchem D man beginnt.
Frage: Wie lautet die Kaprekar-Konstante?
Kaprekar hat folgendes behauptet (1949):
1.) Man nehme eine vierstellige Dezimalzahl D, wobei nicht alle vier Stellen identisch sein dürfen
(also 1111, 2222 etc. sind nicht erlaubt, aber z. B. 0001 ist erlaubt).
2.) D überführe man in zwei Zahle D1 und D2, indem bei D1 die Digits in absteigender und bei D2 in aufsteigender Reihenfolge
angeordnet werden (also z. B. D = 1724 -> D1 = 7421 und D2 = 1247; oder D = 1 -> D1 = 1000 und D2 = 1).
3.) Man subtrahiere nun D2 von D1; mit dem Ergebnis (Dneu = D1 - D2) wiederhole man Pkt. 2 durch Ersetzen von D durch Dneu solange,
bis sich nichts mehr ändert.
Die unglaubliche Behauptung ist, dass bei diesem Algorithmus stets das gleiche Ergebnis herauskommt (die sogenannte Kaprekar-Konstante),
egal, mit welchem D man beginnt.
Frage: Wie lautet die Kaprekar-Konstante?
#1

von Mexx (2370 Punkte)
- 24.02.2017 um 18:09 Uhr

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace A165_KaprekarKonstante { class Program { static void Main(string[] args) { string input = string.Empty; int zahl; do { Console.WriteLine("Geben Sie eine beliebige vierstellige Zahl ein, welche keine Schnapszahl ist!\n" + "Mit exit schließen Sie das Programm"); input = Console.ReadLine(); //Eingabe Prüfen if (input.Length != 4 || !int.TryParse(input, out zahl)) { Console.WriteLine("Fehlerhafte Eingabe! Versuchen Sie es erneut\n\n"); continue; } //Kaprekarkonstante errechnen int kaprekarKonstante = KaprekarKonstanteErmitteln(zahl); string output; if (kaprekarKonstante == 0) output = "\nDas Ergebnis der berechnung ist 0... Haben Sie eine Schnapszahl eingegeben?!\n\n"; else output = string.Format("\nDie Kaprekar-Konstane lautet: {0}\n\n", kaprekarKonstante); Console.WriteLine(output); } while (input != "exit"); } /// <summary> /// Hilfsvariable für die Funktion KaprekarKonstanteErmitteln /// </summary> static int memory = 0; /// <summary> /// Ermittelt die Kaprekar-Konstante für die übergebene vierstellige Zahl /// </summary> /// <param name="zahl">Zahl für die die Kaprekarkonstante ermittelt werden soll</param> /// <returns>Die Kaprekar-Konstante oder Null, falls eine Schnapszahl eingegeben wurde</returns> private static int KaprekarKonstanteErmitteln(int zahl) { //Zahl zurückgeben, falls sich durch die letzte Berechnung keine Änderung ergeben hat if (zahl == memory) return zahl; #region Größte Zahl bilden //Zahl als Byte-Liste mit den binären Werten des Zeichens speichern List<byte> digits = ASCIIEncoding.UTF8.GetBytes(zahl.ToString()).ToList(); string d1 = string.Empty; //Liste digits mit Nullen füllen, falls Zahl weniger als vier Stellen hat while (digits.Count < 4) digits.Add(ASCIIEncoding.UTF8.GetBytes("0")[0]); //Größtmögliche Zahl bilden while (digits.Count > 0) { //Zeichen mit dem aktuell größten Wert ermitteln und an d1 anhängen d1 += ASCIIEncoding.UTF8.GetString(new byte[] { digits.Max() }); //Zuletzt ermitteltes Zeichen aus der Liste löschen byte currentDigit = digits.Max(); for (int i = 0; i < digits.Count; i++) { if (digits[i] == currentDigit) { digits.RemoveAt(i); break; } } } #endregion #region Kleinste Zahl bilden //Zahl als Byte-Liste mit den binären Werten des Zeichens speichern digits = ASCIIEncoding.UTF8.GetBytes(zahl.ToString()).ToList(); string d2 = string.Empty; //Liste digits mit Nullen füllen, falls Zahl weniger als vier Stellen hat while (digits.Count < 4) digits.Add(ASCIIEncoding.UTF8.GetBytes("0")[0]); //Kleinstmögliche Zahl bilden while (digits.Count > 0) { //Zeichen mit dem aktuell kleinsten Wert ermitteln und an d2 anhängen d2 += ASCIIEncoding.UTF8.GetString(new byte[] { digits.Min() }); //Zuletzt ermitteltes Zeichen aus der Liste löschen byte currentDigit = digits.Min(); for (int i = 0; i < digits.Count; i++) { if (digits[i] == currentDigit) { digits.RemoveAt(i); break; } } } #endregion //Berechnen int iD1 = int.Parse(d1); int iD2 = int.Parse(d2); int iNeu = iD1 - iD2; //Zuletzt berechnete Zahl zwischenspeichern und Funktion mit dieser erneut aufrufen memory = zahl; KaprekarKonstanteErmitteln(iNeu); //Errechnete Kaprekar-Konstante zurückgeben return memory; } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1