Java :: Aufgabe #158

3 Lösungen Lösungen öffentlich

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?

Lösungen:

vote_ok
von PC-principal (1340 Punkte) - 06.03.2017 um 11:56 Uhr
Quellcode ausblenden 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);
		}
		}
		}
		}
		}
		
	}
}
vote_ok
von Timbo (50 Punkte) - 04.08.2017 um 13:33 Uhr
Quellcode ausblenden 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;
	}
}
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);
    }
}
1800397

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.