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

4 Lösungen Lösungen öffentlich
#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?
#4
vote_ok
von golileo (20 Punkte) - 04.05.2017 um 15:20 Uhr
Quellcode ausblenden C#-Code
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

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben