C# :: Aufgabe #165 :: Lösung #4
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?
#4
von golileo (20 Punkte)
- 04.05.2017 um 15:20 Uhr
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KapKon
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Geben Sie eine vierstellige Zahl ein, welche nicht vier identische Stellen hat\n" +
"Mit exit schließen Sie das Programm");
String d = Console.ReadLine();
int number;
while((d.Length != 4 || !(int.TryParse(d, out number)) || (d.Distinct().Count() == 1))||d == "exit")
{
if (d == "exit")
{
System.Environment.Exit(1);
}
else
{
Console.WriteLine("Fehlerhafte Eingabe! Versuchen Sie es erneut\n\n");
d = Console.ReadLine();
}
}
String dnew = "";
dnew = doWork(d);
while (dnew.CompareTo(d) != 0)
{
d = "" + dnew;
dnew = doWork(dnew);
//Console.WriteLine(check);
}
Console.WriteLine("Die Kaprekar-Zahl lautet {0}.", d);
Console.ReadKey();
}
public static String doWork(String _d)
{
String d1 = descOrder(_d);
String d2 = ascOrder(_d);
String _dnew = SubstractStrings(d2.PadLeft(4,'0'),d1.PadRight(4,'0'));
Console.WriteLine(d1 + " - " + d2 + "="+_dnew);
return _dnew;
}
public static String SubstractStrings(String _d1, String _d2)
{
String dnew = ""+((Int32.Parse(_d2)) -(Int32.Parse(_d1)));
return dnew;
}
public static String descOrder(String _d)
{
Char[] splittedString = new Char[4];
splittedString = _d.ToCharArray();
if (_d.Distinct().Count() != 1)
{
Array.Sort<Char>(splittedString);
Array.Reverse(splittedString);
}
String reverseD = new String(splittedString);
return reverseD;
}
public static String ascOrder(String _d)
{
Char[] splittedString = new Char[4];
splittedString = _d.ToCharArray();
Array.Sort(splittedString);
String ascD = new String(splittedString);
return ascD;
}
}
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
