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

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?
#3
vote_ok
von hollst (13980 Punkte) - 26.02.2017 um 15:05 Uhr
Quellcode ausblenden C#-Code
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

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