Java :: Aufgabe #158
3 Lösungen
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?
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?
Lösungen:
Java-Code
public class KaprekarKonstante { public static void main(String[] args) { String s="0000"; String sNeu=""; String temp=""; char[] c =s.toCharArray(); for(int x=0;x<10;x++){ c[0]=(char)(x+48); for(int y=0;y<10;y++){ c[1]=(char)(y+48); for(int z=0;z<10;z++){ c[2]=(char)(z+48); for(int q=0;q<10;q++){ c[3]=(char)(q+48); temp=String.valueOf(c); if(!(c[0]==c[1]&&c[0]==c[2]&&c[0]==c[3]) &&(Integer.valueOf(temp)<10000)){ // Hier kann man den auszugebenden Bereich ändern s=sNeu=String.copyValueOf(c); char[] cMax=s.toCharArray(); char[] cMin=s.toCharArray(); int d1=0; int d2=0; do{ s=sNeu; cMax=s.toCharArray(); cMin=s.toCharArray(); for(int u=0;u<c.length;u++){ int max=-1; int positionMax=-1; for(int u2=u;u2<c.length;u2++){ if(cMax[u2]>max){ max=cMax[u2]; positionMax=u2; int u3=cMax[u]; cMax[u]=(char)max; cMax[positionMax]=(char)u3; } } } for(int u=0;u<c.length;u++){ int min=99; int positionMin=-1; for(int u2=u;u2<c.length;u2++){ if(cMin[u2]<min){ min=cMin[u2]; positionMin=u2; int u3=cMin[u]; cMin[u]=(char)min; cMin[positionMin]=(char)u3; } } } temp=s; if(d1!=0){ System.out.print("Neue Zahl:"+d1+"-"+d2+"="+s+" "); }else{ System.out.print("Startzahl:"+s+" "); } s=String.valueOf(cMax); d1=Integer.valueOf(s); s=String.valueOf(cMin); d2=Integer.valueOf(s); System.out.print("max:"+String.valueOf(cMax)+" "); System.out.print("min:"+String.valueOf(cMin)+" "); sNeu=String.valueOf(d1-d2); sNeu=String.format("%04d", Integer.valueOf(sNeu)); }while(!(sNeu.equals(temp))); System.out.println("=>Finales Ergebnis:"+sNeu); } } } } } } }
Java-Code
package trainYourProgrammer; import java.util.Scanner; /* Guess the code is really messy and not good programmed, but it will do it´s job*/ public class KaprekarKonstante { static String d, d2, d3; static int dNew; static int temp = 0; public static void main(String[] args) { start(); } public static void start() { Scanner scan = new Scanner(System.in); //Read digits System.out.println("Geben Sie eine 4-stellige Zahl ein. (Darf nicht vier mal die selbe Zahl beinhalten)"); d = scan.next(); scan.close(); checkNum(d); } public static void checkNum(String num) { char[] temp = num.toCharArray(); //Check if all 4 digits are the same if(temp[0] == temp[1] && temp[2] == temp[3] && temp[0] == temp[3] && d.length() != 4) { System.out.println("Gleichstellige Zahl oder zu viele Zahlen eingegeben. Eingabe ist ungültig."); start(); } else { String d2 = sort(num.toCharArray(), false); //Decrement BubbleSort String d3 = sort(num.toCharArray(), true); //Increment BubbleSort calc(d2, d3); } } //Calculates dNew public static void calc(String a, String b) { dNew = Integer.parseInt(a) - Integer.parseInt(b); if(dNew != temp) { temp = dNew; System.out.println(Integer.toString(dNew)); String tempo = Integer.toString(dNew); checkNum(tempo); } else if(dNew == temp) { System.out.println(dNew); System.exit(0); } } public static String sort(char[] num, boolean choose) { String result = ""; if(choose) //Same as if(choose == true) { for(int i = 0; i < (num.length - 1); i++) { for(int d = 0; d < num.length - i - 1; d++) { if(num[d] > num[d+1]) { char swap = num[d]; num[d] = num[d+1]; num[d+1] = swap; } } } result = new String(num); } else //boolean only got true or false --> Same as else if(choose == false) { for(int i = 0; i < (num.length - 1); i++) { for(int d = 0; d < num.length - i - 1; d++) { if(num[d] < num[d+1]) { char swap = num[d]; num[d] = num[d+1]; num[d+1] = swap; } } } result = new String(num); } return result; } }
intSort() ist möglicherweise etwas umständlich, aber es funktioniert
if it looks stupid, but works, it ain't stupid :D
if it looks stupid, but works, it ain't stupid :D
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); } }