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:
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);
}
}
}
}
}
}
}
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
Java-Code
if it looks stupid, but works, it ain't stupid :D
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);
}
}
