Denkanstoß für Umlaufzahl dringend benötigt!

moccajoghurt

Bekanntes Mitglied
Hi, bearbeite im Moment eine Aufgabe meines Java-Kurses, die da lautet:

Aufgabe 14:
Zu einer gegebenen natürlichen Zahl z mit n-Ziffern ist ihre sogenannte „Umlaufzahl“ u folgendermaßen definiert:

Die erste Ziffer von z ist auch die erste Ziffer von u.

Die n+1-te Ziffer von u ergibt sich folgendermaßen: Laufe in der Zahl z von der n-ten Ziffer aus gesehen so viele Ziffern nach rechts (gegebenenfalls wieder vorne anfangen!) wie der Wert der n-ten Ziffer angibt. Die erreichte Ziffer in z ist die n+1-te Ziffer von u.

Sobald eine Ziffer in z zum zweiten Mal erreicht wird, ist der Algorithmus beendet.
Beispiel: (z = 6354)
6 3 5 4 u: 6
6 3 5 4 u: 65
6 3 5 4 u: 654
6 3 5 4 u: 6544
Noch ein Beispiel: (z = 1213013)
1 2 1 3 0 1 3 u: 1
1 2 1 3 0 1 3 u: 12
1 2 1 3 0 1 3 u: 123
1 2 1 3 0 1 3 u: 1233
1 2 1 3 0 1 3 u: 12331
1 2 1 3 0 1 3 u: 123313
Aufgabe: Schreiben Sie ein Java-Programm, das eine natürliche Zahl z einliest, die zugehörige Umlaufzahl berechnet und ausgibt.


Die einzigen bisher erlernten Anwesiungen sind for, do, while, if, break, continue und Funktionen und Prozeduren. Daher kann ich den Programm-Ablauf nur damit planen.

Meine bisherige Idee ist es jeder Ziffer der Zahl zu numerieren, wofür ich auch schon eine funktion habe. Leider fehlt mir sonst ein Ansatz.

Gruß
 
Moin,

poste einfach mal den Code, den Du bislang hast und stelle dann konkrete Fragen dazu !!

Ich denke nicht, dass hier irgendwer mal einfach so Deine Aufgaben löst ... und Du würdest dabei ja auch nichts lernen 😀

Gruß
Klaus
 
trenne das Programm erstmal in Eingabe, Funktionalität und Ausgabe.

Ich erklär es jetzt erstmal prozedural, weil dich oop bestimmt eher verwirren würde.

Zuerst würde ich mal eine Zahl einlesen. Dazu nimmst du einfach einen
Code:
BufferedReader
, instanziiert mit einen
Code:
InputStreamReader
. Jetzt hast du folglich erstmal einen String. Das ist auch gut so, weil du diesen besser iterieren kannst als einen integer (
Code:
charAt(x)
ist einfach leichter, als mathematische Funktionen). Wie gerade schon angedeutet, musst du jetzt ganz einfach durch diesen String iterieren. Dazu nimmst du einfach eine for-Schleife. Die erste Ziffer ist ja klar (könntest auch bereits vor der for-Schleife zur Ausgabe (
Code:
StringBuilder
nehmen) hinzufügen). Danach nimmst du einfach immer den Zähler addierst den Wert, den
Code:
Integer.parseInt(String.valueOf(deinString.charAt(deinZähler)))
derzeit liefert und prüfst ab, ob das Ergebnis kleiner als deine komplette Stringlänge (vor der for-Schleife einlesen!) ist. Wenn ja, subtrahierst du die länge und fügst
Code:
charAt(ergebnis)
zu deinem StringBuilder hinzu.
Danach noch ein
Code:
System.out.println(deinSB.toString());
und du bist fertig 🙂

Der
Code:
StringBuilder
ist nicht zwingend erfoderlich aber nachdem Strings unveränderlich sind, würdest du mit
Code:
String += andererString
immer wieder neue String Objekte erzeugen. Nachdem das imho der Kompiler optimiert ist es eigentlich egal aber gerade in einem Java-Kurs zusammen mit eben genanntem Argument, kommt das bestimmt ganz gut 😉

edit: das "Drumherum" kommt danach. z.b. Anwenderfehler vorbeugen (abprüfen, ob die Eingabe wirklich eine Zahl ist) oder ein Shell-GUI ("Wollen Sie noch eine Zahl umwandeln? (y/n)")

edit2: also entweder hab ich jetzt einen denkfehler drin, oder deine beispiele sind falsch... wie kann bei 1213013 am vierten index (bei "0") 1 rauskommen? x+0 ist x -> u = 1333031 (6354 wäre für mir 6644).
 
Zuletzt bearbeitet:
Noch ein Beispiel: (z = 1213013)
1 2 1 3 0 1 3 u: 1
1 2 1 3 0 1 3 u: 12
1 2 1 3 0 1 3 u: 123
1 2 1 3 0 1 3 u: 1233
1 2 1 3 0 1 3 u: 12331
1 2 1 3 0 1 3 u: 123313

versteh zwar noch nicht ganz was NRG will aber ich schreibe mal ne Erklärung hinter 😉

1 2 1 3 0 1 3 u: 1 // es startet wie angegeben an erster stelle Also U = 1
1 2 1 3 0 1 3 u: 12 // wir gehen einen Schritt nach rechts und fügen hinzu Also U = 12
1 2 1 3 0 1 3 u: 123 // wir gehen zwei Schritte nach rechts und fügen hinzu Also U = 123
1 2 1 3 0 1 3 u: 1233 // wir gehen drei Schritte nach rechts und fügen hinzu Also U = 1233
1 2 1 3 0 1 3 u: 12331 // wir gehen drei Schritte nach rechts und fügen hinzu Also U = 12331
1 2 1 3 0 1 3 u: 123313 // Jetzt noch den letzten Schritt nach rechts und schon haben wir U = 123313

da nach doppeltem Vorkommen(Auslesen!) einer Ziffer das Programm beendet werden soll ist hier Schluss 🙂

Ich habe das Programm soweit fertig nur hört er nicht auf 🙂 wie siehts bei euch aus 😛

EDIT : Also habe ich eine Endlosschleife 😀 naja nicht ganz da nach 200durchlaufen ArrayIndexOutOfBoundsException entsteht =)
 
achso. habe es etwas falsch gelesen: "Die n+1-te Ziffer von u ergibt sich folgendermaßen: Laufe in der Zahl z von der n+1-ten Ziffer aus gesehen so viele Ziffern nach rechts (gegebenenfalls wieder vorne anfangen!) wie der Wert der n+1-ten Ziffer angibt. Die erreichte Ziffer in z ist die n+1-te Ziffer von u". Naja dann ists klar richtig. Algo ist allerdings der Gleiche. von daher egal 🙂
 
ok um ehrlich zu sein, hab ich die Aufgabe ziehmlich unterschätzt. dachte man nimmt den Wert der "n-ten Zahl" von der Eingabe. Nachdem das grad nicht sooo gut geklappt hat mit "Code in Worte fassen" hier mal ein Beispiel:

Java:
	public String getUmlaufzahl() {
		StringBuilder sb = new StringBuilder();
		sb.append( input.charAt( 0 ) );
		int offset = 0, i = 0, length = input.length();
		boolean[] isReached = new boolean[length];
		while ( !isReached[offset] ) {
			isReached[offset] = true;
			offset = Integer.parseInt( String.valueOf( sb.charAt( i++ ) ) ) + offset;
			if ( offset >= length )
				offset -= length;
			sb.append( input.charAt( offset ) );
		}
		return sb.toString();
	}

edit: input ist ein Attribut der Klasse und wurde bei meinem Beispiel im Konstruktor mit der Eingabe instanziiert
 
Zuletzt bearbeitet:
oh da is mein Prog schon wesentlich komplizierter 😀
ich glaub ich muss lernen logischer zu denken 🙂

Java:
 offset = Integer.parseInt( String.valueOf( sb.charAt( i++ ) ) ) + offset;
heisst das "offset ist ein integer-wert vom String sb an der stelle i + offset" ?

und wenn ja wieso wird packst du das komplette "wort" in den SB und er ersetzt ihn dann statt einfach die variable input zu verwenden?? ???:L
 
oh da is mein Prog schon wesentlich komplizierter 😀
ich glaub ich muss lernen logischer zu denken 🙂

Java:
 offset = Integer.parseInt( String.valueOf( sb.charAt( i++ ) ) ) + offset;
heisst das "offset ist ein integer-wert vom String sb an der stelle i + offset" ?
ja (also nicht wert(Stelle i + offset), sondert (wert Stelle i) + offset) :autsch:


und wenn ja wieso wird packst du das komplette "wort" in den SB und er ersetzt ihn dann statt einfach die variable input zu verwenden?? ???:L

Der StringBuilder ist nicht zwingend erfoderlich aber nachdem Strings unveränderlich sind, würdest du mit String += andererString immer wieder neue String Objekte erzeugen. Nachdem das imho der Kompiler optimiert ist es eigentlich egal...
hallte ich einfach für "guten Stil" das explizit zu tun

edit: ausserdem sollte sich ja input nicht verändern. den brauchst du ja noch
 
Zuletzt bearbeitet:
Und ist eindeutig einfacher als meine variante also werde ich mal weiter üben 🙂 mit meinem hüpfenden button der iwann einfach aufhört zu hüpfen 😀
 

Zurück
Oben