knobelaufgabe

Status
Nicht offen für weitere Antworten.
K

Kuggel

Gast
Also, eine ganz komische aufgabe.

folgende methoden sollen in eine klasse implementiert werden:

public static long berechneNaechstesElement(long element)
Berechnet das nächste Element zu der übergebenen Zahl element gemäß obiger Regel.

public static long[] berechneFolge(long startElement, int iterationen)
Berechnet iterationen–viele Folgeelemente zu startElement und speichert sie im zurückzugebenden Array.
Erstes Element des Arrays ist startElement. Für ungültige Eingaben (startElement < 1, iterationen < 0)
liefert die Methode ein Array der Länge der 0 zurück.

Es geht um die C0nway-Folge.
bsp.:erklärung:

Ausgehend von einem Element der Folge wird das nächste Element gebildet, indem man (von links nach rechts) Gruppen
gleicher Ziffern bildet und dann die Länge jeder Gruppe und deren Ziffer notiert. Dies wiederholt man für alle Gruppen
des Elements.


So ich werd daraus einfach nicht schlau. bin dankbar für alles.
 
K

Kuggel

Gast
mein hauptproblem ist nicht der code sondern die conway folge ich blicke die regelmäßigkeit darin einfach nich
 
K

Kuggel

Gast
hm, also wenn ichs richtig verstanden habe, kommt es ja dann nicht auf eine rechnung an sondern eher auf das aussehen einer zahl.

gibts irgend eine speziell methode dafür? man muss ja irgendwie die zahl in die einzelnen zahlen zerstückeln und dann zählen wie oft die jeweilige zahl auftritt. anschließend muss man dann häufigkeit in der eine zahl auftritt (vlt ein int wert) vor die zahl schreiben.

Das ist jetzt nur mal mein denkansatz. wie ich das in java so komplett umsetzen könnte wüsste ich nicht. wie erkennt java, dass es diese schritte machen soll?
 
S

SlaterB

Gast
> wie erkennt java, dass es diese schritte machen soll?

Java muss nicht denken, dass macht ja der Programmierer,


es ist in Java möglich, Zahlen in einen String umzuwanden, am kürzesten mit
String st = ""+zahl;
und dann Schleife über die Länge, charAt() usw.

die Umwandlung brauchst du aber nur einmal am Anfang,
danach bietet es sich an, die 'Zahl' direkt als String zu speichern,

man sieht ja an dem Beispiel im Wiki, dass die 8. Zahl in der Folge schon 10 Stellen haben kann,
das passt bald in keine Zahlenvariable mehr rein, Strings können dagegen beliebig lang werden

edit:
> Die Dezimaldarstellung des 70. Folgengliedes für d = 1 hat bereits 179,691,598 Stellen

ok, das wären dann bestimmt 400 MB Speicherbedarf, also reicht String auch nicht lange ;)
 
G

Gast

Gast
Ist extra nicht kommentert, damit es nicht ganz so einfach ist ;)

Code:
public class Conway {

	public static void main(String[] args) {
		Conway conway = new Conway();
		long[] convay = conway.convay(3, 8);

		for (long l : convay) {
			System.out.println(l);
		}
	}

	public long[] convay(int start, int lenght) {
		if (start <= 0 || lenght <= 0) {
			return new long[0];
		}
		if (start == 22) {
			return new long[] { 22 };
		}
		long[] convay = new long[lenght];
		convay[0] = start;
		for (int i = 1; i < convay.length; i++) {
			convay[i] = createConvay(convay[i - 1]);
		}
		return convay;
	}

	private long createConvay(long number) {
		long result = 0;
		long fak = 1;
		int last = -1;
		int count = 0;
		while (number != 0) {
			int current = (int) (number % 10);
			if (current != last) {
				if (count != 0) {
					result += (fak * count);
					fak *= 10;
				}
				result += (fak * current);
				fak *= 10;
				last = current;
				count = 0;
			}
			count++;
			number /= 10;
		}

		if (count != 0) {
			result += (fak * count);
			// fak *= 10;
		}
		return result;
	}
}
 

0x7F800000

Top Contributor
@Marco 13: was ist, sind da zwei mit derselben hausaufgabe?^^

Hier jedenfalls nochmal derselbe kram, allerdings gleich mit zeichenketten (dekadische entwicklung kann man sich in dem Fall eigentlich sparen, weil der numerische Wert ja an keiner stelle interessiert, ist nur verschwendung das hin und her umzurechnen)

Code:
public class ConwaySequence {

	private static String next(String s){
		char currentChar=s.charAt(0);
		int counter=1;
		String result="";
		for(int i=1; i<s.length();i++){
			if(s.charAt(i)!=currentChar){
				result+=counter+""+currentChar;
				counter=1;
				currentChar=s.charAt(i);
			}else{
				counter++;
			}
		}
		result+=counter+""+currentChar;
		return result;
	}
	
	private static String[] generateSequence(String startValue, int length){
		String[] result=new String[length];
		result[0]=startValue;
		for(int i=1; i<result.length; i++){
			result[i]=next(result[i-1]);
		}
		return result;
	}
	
	public static void main(String[] args) {
		for(String s:generateSequence("3",20)) System.out.println(s);
	}
}
achso, ja, ich hab's nur zum Spaß gemacht, ist schon klar dass es nur schadet ;)
Also, nur um das pädagogisch ein wenig aufzuwerten:
Kuggel du fauler Sack, mach ma was! ;)

(besser so? :) hoffentlich fühlst du dich jetzt motivierter und so :D )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben