Input/Output I-stellige Hexadezimalzahlen schreiben

eclipseworker

Bekanntes Mitglied
Ich habe versucht ein Programm zu schreiben, dass mir bei der Eingabe einer Variablen i alle Hexadezimal-zahlen mit i Stellen unter einander hinschreibt, begonnen bei 0. Also will ich wenn ich 2 eingebe diese Ausgabe
00
01
...
ff
und bei 3 diese:
000
001
...
fff
usw. Mein Code macht aber das (bei der Eingabe 2):
0
1
...
f
0
1
...
f
Was kann ich tun ????:L
Hier ist der Code :shock: (auch im Anhang als JAVA-Datei denn er kompiliert tut nur nicht was er soll)
Java:
package do25;
import java.util.*;
public class do25 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		while (true) {
			try {
				System.out.println("Bitte Sie geben Zahl ein:");
				class Some {
					Scanner sc = new Scanner(System.in);
					public int i = sc.nextInt();
				}
				int i = (new Some()).i;
			    dienst(i);
				break;
			} catch (InputMismatchException e) {
				System.err.println("Geben Sie eine Zahl ein!");
			} 
		}
	}

	private static void dienst(int nextInt) {
		// TODO Auto-generated method stub
		for (int k=1;k <= nextInt; k++){
				letter(k);
			}
		}

	private static void letter(int j) {
		for (j=0; j<=15;j++){
		if (j<=9){
			System.out.print(j);
		} else {
			switch (j){
				case 10: System.out.print("a"); break;
				case 11: System.out.print("b"); break;
				case 12: System.out.print("c"); break;
				case 13: System.out.print("d"); break;
				case 14: System.out.print("e"); break;
				case 15: System.out.print("f"); break;
			}
		}
		System.out.println();
		
		}
	}
}
 

Anhänge

Ohne mir den Code anzusehen:

1) Integer.toHexString(i)
2) Integer.parseInt(s, radix) (Als Umkehrfunktion benutzbar).
3) 00 -> 0 -> (To Dez.) -> 0. 0 ist also niemals eine 2-Stellige Zahl. Die erste 2-Stellige Hexadezimale Zahl ist 10.
4) Ist dir klar, das in der While eine Klasse steht? So etwas komisches habe ich noch nie gesehen, hätte auch nicht gedacht, dass es gehen würde. Anonyme Klassen ja, aber komplett neue definieren? Oo
5) Die erste Zahl mit einer bestimmten Stellenanzahl beginnt im Hexadezimalen wie auch im Dezimalen, Binären oder Oktalen mit einer 1 gefolgt von (n - 1) 0. Diese Zahl kannst du einfach so darstellen. Danach musst du sie nur nach Dez. umrechnen lassen, eine Schleife um 1 erhöhen, und jedes mal wieder zu Hex und die Stellen zählen. So einfach ginge das, wenn ich jetzt keinen Denkfehler gemacht habe.
 
Hi,
immer erst Anfangen das Problem an sich zu verstehen ^^
Zum rausfinden ob eine Zahl in einem bestimmtem Zahlensystem x Stellen hat kann man log zur basis des Zahlensystems verwenden.
In dem fall hier kann man sich sogar das casten der int-werte sparen *grins*
ob man in dem Fall jetzt length per args abfragt oder von der Kommandozeile ließt sei jedem selbst überlassen 😉
Java:
public static void main(String[] args) {
		int number = 0;
		int length = 3;
		while(Math.log(number)/Math.log(16) < length){
			System.out.println(Integer.toHexString(number++));
		}
	}
@Volvagia, Klassen kann man "eigentlich" überall deklarieren, ob die dann Anonym sind oder benannt sind unterscheidet sich für den Compiler nicht, da er im Hintergrund sowieso .class Dateien erzeugt (benennung ist dabei immer namederhauptklasse$zahl.class, sieht man gut wenn man mal zu den .class springt bei größeren projekten)
Gruß
 
Hi,
immer erst Anfangen das Problem an sich zu verstehen ^^
Zum rausfinden ob eine Zahl in einem bestimmtem Zahlensystem x Stellen hat kann man log zur basis des Zahlensystems verwenden.
In dem fall hier kann man sich sogar das casten der int-werte sparen *grins*
ob man in dem Fall jetzt length per args abfragt oder von der Kommandozeile ließt sei jedem selbst überlassen 😉
Java:
public static void main(String[] args) {
		int number = 0;
		int length = 3;
		while(Math.log(number)/Math.log(16) < length){
			System.out.println(Integer.toHexString(number++));
		}
	}
@Volvagia, Klassen kann man "eigentlich" überall deklarieren, ob die dann Anonym sind oder benannt sind unterscheidet sich für den Compiler nicht, da er im Hintergrund sowieso .class Dateien erzeugt (benennung ist dabei immer namederhauptklasse$zahl.class, sieht man gut wenn man mal zu den .class springt bei größeren projekten)
Gruß
Das funktioniert gut ich hätte, aber gerne, dass das ganze mit führenden Nullen angeschrieben wird. Und lenght ist die Eingabe (das was ich als i definiert habe?)
 
Hi,
meine Überlegung dahinter war(keine Garantie auf Korrektheit!):
eine Zahl x in einem Zahlensystem zur Basis y hat Logarithmus von x zur Basis y Stellen.
Also kann ich die zahl gemütlich dezimal hochzählen und mit dem log prüfen ob die Zahl außerhalb meines Stellenbereichs ist. Das mache ich hiermit:
Java:
Math.log(number)/Math.log(16) < length
Dann gebe ich die Zahl hexadezimal aus und nachdem sie ausgewertet wurde zähle ich sie eins hoch:
Java:
System.out.println(Integer.toHexString(number++));
Das ganze auf führende nullen zu erweitern ist auch kein Akt (wie elegant das jetzt noch ist sei mal dahingestellt 😀)

1. den Hex-String nicht direkt ausgeben sondern erstmal merken
2. wenn der String kürzer als die länge ist wird er solange mit führenden nullen gefüllt bis es passt
3. dann den String ausgeben

Java:
public static void main(String[] args) {
		int number = 0;
		int length = 3;
		while(Math.log(number)/Math.log(16) < length){
			String hexString = Integer.toHexString(number++);
			while(hexString.length() < length){
				hexString = "0"+hexString;
			}
			System.out.println(hexString);
		}
	}

Bei längeren Strings hätte man damit zwar einige unnötige Array-Verschiebungen, aber ich glaube in dem Stellenbereich für Performanz bewegen wir uns gerade nicht 😀
Gruß

Edit: etwas schneller wird es jedenfalls schonmal wenn man Math.log(16) nur einmal berechnet und als variable speicher - eben noch eingefallen.
 
Zuletzt bearbeitet von einem Moderator:
Warum denn so kompiliziert? Du weist doch wieviel Stellen maximal erlaubt! Rechne die Zahl um, wandle sie in String und überprüfe die Länge, oder teile halt geschickt. Wenn Du weist, das die Zahl 2 Stellen hat, dann mußt Du sie in in der Ausgabe einfach auffüllen, bis i.

[edit]also i - Zahllänge Nullen voranschreiben[/edit]
 
Hi,
meine Überlegung dahinter war(keine Garantie auf Korrektheit!):
eine Zahl x in einem Zahlensystem zur Basis y hat Logarithmus von x zur Basis y Stellen.
Also kann ich die zahl gemütlich dezimal hochzählen und mit dem log prüfen ob die Zahl außerhalb meines Stellenbereichs ist. Das mache ich hiermit:
Java:
Math.log(number)/Math.log(16) < length
Dann gebe ich die Zahl hexadezimal aus und nachdem sie ausgewertet wurde zähle ich sie eins hoch:
Java:
System.out.println(Integer.toHexString(number++));
Das ganze auf führende nullen zu erweitern ist auch kein Akt (wie elegant das jetzt noch ist sei mal dahingestellt 😀)

1. den Hex-String nicht direkt ausgeben sondern erstmal merken
2. wenn der String kürzer als die länge ist wird er solange mit führenden nullen gefüllt bis es passt
3. dann den String ausgeben

Java:
public static void main(String[] args) {
		int number = 0;
		int length = 3;
		while(Math.log(number)/Math.log(16) < length){
			String hexString = Integer.toHexString(number++);
			while(hexString.length() < length){
				hexString = "0"+hexString;
			}
			System.out.println(hexString);
		}
	}

Bei längeren Strings hätte man damit zwar einige unnötige Array-Verschiebungen, aber ich glaube in dem Stellenbereich für Performanz bewegen wir uns gerade nicht 😀
Gruß

Edit: etwas schneller wird es jedenfalls schonmal wenn man Math.log(16) nur einmal berechnet und als variable speicher - eben noch eingefallen.

Hat gut funktioniert :applaus: nur als ich lenght auf 4 geändert habe begann dass ganze bei cbea :autsch: ich möchte aber, dass das Programm unabhängig von lenght funktioniert. :bahnhof:
 

Neue Themen


Zurück
Oben