public class Verhext extends MiniJava { // x^y public static int pow(int x, int y) { return java.math.BigInteger.valueOf(x).pow(y).intValueExact(); } public static void main(String[] args) { String input = readString(); int output = 0; // Implementierung mit pow: // 3) Negatives Vorzeichen beachten int istNegativ = 0; // = 1, falls negatives Vorzeichen if (input.charAt(0) == '-') istNegativ = 1; // 4) Bonus: Fehlerbehaftet Eingaben abfangen am Anfang (1. & 2. Zeichen) int ungueltig = 0; if (input.charAt(0+istNegativ) != '0') ungueltig += 1; if (input.charAt(1+istNegativ) != 'x' && input.charAt(1+istNegativ) != 'X') ungueltig += 1; // 1) Rückwärs mit pow arbeiten int skipped = 0; // übersprungene Potenzen for (int i = input.length()-1; i >= 2+istNegativ; i--) { char currentChar = input.charAt(i); int currentInt; // = currentChar als Dezimalzahl (nach Umwandlung) if (currentChar >= '0' && currentChar <= '9') // 1) 0-9 currentInt = currentChar - '0'; else if (currentChar >= 'A' && currentChar <= 'F') // 1) A-F (10-15) currentInt = 10 + currentChar-'A'; else if (currentChar >= 'a' && currentChar <= 'f') // 1) a-f (10-15) currentInt = 10 + currentChar-'a'; else if (currentChar == '_' && // 3) Unterstriche akzeptieren (i > 2+istNegativ && i < input.length()-1)) { // 4) Bonus: Keine Unterstriche am Anfang/Ende skipped += 1; // benötigt für pow continue; } else { // 4) Ungültiges Zeichen ungueltig += 1; break; } output += pow(16, input.length()-1-i-skipped) * currentInt; } if (ungueltig >= 1) write("Die Eingabe " + input + " ist keine gültige Hexadezimalzahl." + " Hexadezimalzahlen beginnen mit 0x oder 0X, optional einem" + " Minus zuvor, gefolgt von einer beliebigen Anordnung von" + " Ziffern (0-9) und den Buchstaben A-F. Zwischen jeweils" + " zwei solcher Zeichen dürfen Unterstriche stehen." + " Es wurden insgesamt " + ungueltig + " ungültige Zeichen" + " gefunden."); else { if (istNegativ == 1) output *= -1; write(output); } // write(hexToDec(input)); } /** * Wandelt eine in einem String gespeicherte Hexdezimalzahl in einen Integer * um und gibt diesen zurück. * * @param input der vom Benutzer eingegebene Hexadezimalwert als String */ public static int hexToDec(String input) { int output = 0; // 3) Negatives Vorzeichen beachten int istNegativ = 0; // = 1, falls negatives Vorzeichen if (input.charAt(0) == '-') istNegativ = 1; // 4) Bonus: Fehlerbehaftet Eingaben abfangen am Anfang (1. & 2. Zeichen) if (input.charAt(0+istNegativ) != '0' || (input.charAt(1+istNegativ) != 'x' && input.charAt(1+istNegativ) != 'X')) { write("Die Eingabe " + input + " ist keine gültige Hexadezimalzahl. " + "Sie muss mit 0x, 0X, -0x oder -0X beginnen."); throw new IllegalArgumentException(); // alternativ (in main) mit Variable arbeiten und for in den else Teil } // 1) Basisfälle erkennen: for (int i = 2+istNegativ; i < input.length(); i++) { char currentChar = input.charAt(i); int currentInt; // = currentChar als Dezimalzahl (nach Umwandlung) if (currentChar >= '0' && currentChar <= '9') // 1) 0-9 currentInt = currentChar - '0'; else if (currentChar >= 'A' && currentChar <= 'F') // 1) A-F (10-15) currentInt = 10 + currentChar-'A'; else if (currentChar >= 'a' && currentChar <= 'f') // 1) a-f (10-15) currentInt = 10 + currentChar-'a'; else if (currentChar == '_' && // 3) Unterstriche akzeptieren (i > 2+istNegativ && i < input.length()-1)) // 4) Bonus: Keine Unterstriche am Anfang/Ende continue; else { // 4) Ungültiges Zeichen write("Die Eingabe " + input + " ist keine gültige Hexadezimalzahl, " + "da nach dem 0x nur die Zahlen 0-9 oder A-F folgen " + "darf. Unterstriche dürfen nur zwischen zwei Ziffern" + "bzw. Buchstaben stehen."); throw new IllegalArgumentException(); // alternativ (in main) mit break und Variable arbeiten } output *= 16; // Vorgänger multiplizieren output += currentInt; } // 3) Negatives Vorzeichen Anwenden if (istNegativ == 1) output *= -1; return output; } }