C# :: Aufgabe #165 :: Lösung #3
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?
#3
von hollst (13980 Punkte)
- 26.02.2017 um 15:05 Uhr
using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
namespace kaprekar {
class Program {
static void Main() {
String LZ = " ";
ulong digits = 4;
String input = String.Empty;
List<ulong> constanten = new List<ulong>();
double BASIS = 10;
ulong imax = (ulong)Math.Pow(BASIS, digits);
((imax - 1).ToString("n0") + LZ + ulong.MaxValue.ToString("n0")).Message();
for (ulong i = 1; i < imax; i++) {
input = i.ToString();
String sD1 = input.Sort(true, digits);
String sD2 = input.Sort(false, digits);
NumberStyles style = NumberStyles.Integer;
ulong D, D1, D2;
List<ulong> LD = new List<ulong>();
int circle = 0;
int steps = 0;
while (true) {
D1 = ulong.Parse(sD1, style);
D2 = ulong.Parse(sD2, style);
D = D1 - D2;
if (LD.Contains(D)) {
circle = LD.Count - LD.IndexOf(D);
if (circle == 1) {
if (!constanten.Contains(D)) {
("add " + D.ToString("n0") + LZ + D.ToString("X") +
" steps: " + steps.ToString()).Message();
constanten.Add(D);
}
}
break;
}
else
if (D != 0)
LD.Add(D);
else
break;
String sD = D.ToString();
sD1 = sD.Sort(true, digits);
sD2 = sD.Sort(false, digits);
steps++;
};
}
"Kaprekar-Konstanten:".Message();
for(var i = 0; i < constanten.Count; i++)
(constanten[i].ToString("n0") + LZ + constanten[i].ToString("X")).Message();
"ready".EndMessage();
}
}
public static class MyKaprekar {
public static string Sort(this string s, Boolean bo_downward, ulong digits) {
while ((ulong)s.Length < digits)
s = "0" + s;
String result = string.Empty;
Char[] c = s.ToCharArray();
Array.Sort(c);
for (var i = 0; i < c.Length; i++)
if (!bo_downward)
result += c[i].ToString();
else
result += c[c.Length - 1 - i].ToString();
return result;
}
public static void Message(this string s) {
Console.WriteLine(s);
}
public static void EndMessage(this string s) {
s.Message(); Console.ReadKey();
}
}
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
