C# :: Aufgabe #165 :: Lösung #2
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?
#2

von Umfegumfe (50 Punkte)
- 27.02.2017 um 09:44 Uhr

namespace Kaprekar { class Program { static void Main(string[] args) { int d = GetKaprekarStart(); int kaprekar = GetKaprekarNumber(d); Console.WriteLine("Die vierstellige Kaprekar-Zahl lautet {0}!", kaprekar); Console.WriteLine("Bitte Taste drücken!"); Console.ReadKey(); } static int GetKaprekarNumber(int startNumber) { int[] digits = NumberToFourDigitArray(startNumber); int[] sortedDigits = sortedFourDigitArray(digits); int[] sortedDigitsInverted = invertDigitArray(digits); int d1 = digitArrayToInt(sortedDigitsInverted); int d2 = digitArrayToInt(sortedDigits); int d = d1 - d2; Console.WriteLine("Zwischenschritt: d={0}, d1={1}, d2={2}, d1-d2={3}...", startNumber, d1, d2, d); if (d == startNumber) return d; return GetKaprekarNumber(d); } static int GetKaprekarStart() { while (true) { Console.Write("Bitte vierstellige Startzahl eingeben: "); string s = Console.ReadLine(); int number = Convert.ToInt32(s); if (number > 0 && number < 10000) { if (IsNumberValidForKaprekar(number)) return number; } Console.WriteLine("Keine gültige Startzahl, bitte wiederholen!"); } } static bool IsNumberValidForKaprekar(int number) { int[] kaprekarDigits = NumberToFourDigitArray(number); int start = kaprekarDigits[0]; for (int i = 1; i < kaprekarDigits.Length; i++) { if (kaprekarDigits[i] != start) return true; } return false; } static int[] NumberToFourDigitArray(int number) { int[] retVal = new int[4]; for (int i = 0; i < 4; i++) { retVal[i] = number % 10; number = number / 10; } return retVal; } static int[] sortedFourDigitArray(int[] digits) { bool sorted; do { sorted = true; for (int i = 0; i < digits.Length - 1; i++) { if (digits[i] > digits[i + 1]) { int temp = digits[i]; digits[i] = digits[i + 1]; digits[i + 1] = temp; sorted = false; } } } while (!sorted); return digits; } static int[] invertDigitArray(int[] digits) { int[] retVal = new int[digits.Length]; for (int i = 0; i < digits.Length; i++) { retVal[i] = digits[digits.Length - i - 1]; } return retVal; } static int digitArrayToInt(int[] digits) { int retVal = 0; int multiplier = 1; int[] invertedDigits = invertDigitArray(digits); for (int i = 0; i < invertedDigits.Length; i++) { retVal = retVal + invertedDigits[i] * multiplier; multiplier = multiplier * 10; } return retVal; } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1