Java :: Aufgabe #158 :: Lösung #3

3 Lösungen Lösungen öffentlich
#158

Existiert die Kaprekar-Konstante?

Anfänger - Java 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 Bufkin (1410 Punkte) - 20.09.2017 um 12:13 Uhr
intSort() ist möglicherweise etwas umständlich, aber es funktioniert
if it looks stupid, but works, it ain't stupid :D

Quellcode ausblenden Java-Code
import java.util.*;

class kaprekar
{
    public static int intSort(int eingabe, boolean reverse)
    {
        Integer[] liste = new Integer[4];
        int tausend = eingabe / 1000;
        eingabe = eingabe % 1000;
        int hundert = eingabe / 100;
        eingabe = eingabe % 100; 
        int zehn = eingabe / 10;
        eingabe = eingabe % 10;
        int eins = eingabe;
        
        liste[0] = tausend;
        liste[1] = hundert;
        liste[2] = zehn;
        liste[3] = eins;
       
        ArrayList<Integer> intList = new ArrayList<Integer>();
        for (Integer current : liste)
        {
            intList.add( current );
        }
        
        if(reverse)
        {
            Comparator<Integer> comparator = Collections.reverseOrder();
            Collections.sort(intList, comparator);    
        } else {
            Collections.sort(intList);    
        }
        int ausgabe = 0;
        int multiplikator = 1;
        for(int i = 3; i >= 0; i--)
        {
            ausgabe += intList.get(i) * multiplikator;
            multiplikator *= 10;
        }
        return ausgabe;
    }
    
    public static void berechnung(int d)
    {
        int tmp = d;
        int dneu = 0;
        int vorheriger = 0;
        while(true)
        {
            int d1 = intSort(d, true);
            int d2 = intSort(d, false);
            dneu = d1 - d2;
            d = dneu;
            if(vorheriger == d)
            {
                break;
            } else {
                vorheriger = d;    
            }
        }
        System.out.println("Eingabe: " + tmp + "\tKaprekar-Konstante: " + d);
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        berechnung(6214);
        berechnung(1263);
        berechnung(8734);
        berechnung(373);
        berechnung(1);
        berechnung(7235);
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

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