public class LatexMultiplication extends MiniJava { // 1. Zahl solang einlesen, bis gültig (unabhängig von Basis) public static int[] readNumber() { int[] number; boolean valid; do { String input = readString("Bitte die Zahl in entsprechender Basis eingeben:"); number = new int[input.length()]; valid = true; // Annahme (kann sich ändern) for (int i = 0; i < input.length(); i++) { char c = input.charAt(input.length()-1-i); if (c >= '0' && c <= '9') { number[i] = c - '0'; } else if (c >= 'A' && c <= 'Z') { number[i] = c - 'A' + 10; } else { // ungültig write("Das Zeichen " + c + " ist ungültig. Bitte neu eingeben."); valid = false; break; } } } while(!valid); // valid == false return number; } // 2. Zahl in String umwandeln public static String toString(int[] number) { String s = ""; for (int digit : number) s = intToChar(digit) + s; return s; } // 3. Addition zweier Zahlen derselben Basis public static int[] add(int[] a, int[] b, int base) { int[] result = new int[Math.max(a.length, b.length)+1]; // Ergebniszahl hat maximal eine Ziffer mehr als größere; automatisch mit 0ern befüllt for (int i = 0; i < result.length-1; i++) { if (i < a.length) result[i] += a[i]; if (i < b.length) result[i] += b[i]; result[i+1] = result[i] / base; // Übertrag result[i] %= base; } // Führende Null entfernen if (result[result.length-1] == 0) result = java.util.Arrays.copyOf(result, result.length-1); return result; } // 4. Zahl mit Ziffer mutliplizieren und nach links shiften public static int[] mulDigit(int[] a, int digit, int shift, int base) { int[] result = new int[a.length+shift+1]; // maximal um eins zu groß for (int i = 0; i < a.length; i++) { result[i+shift] += a[i] * digit; result[i+shift+1] = result[i+shift] / base; // Übertrag (0 oder1) result[i+shift] %= base; } // Führende Null entfernen if (result[result.length-1] == 0) result = java.util.Arrays.copyOf(result, result.length-1); return result; } // 5. Multiplikation Durchführen (inkl. Latex Ausgabe) public static int[] mul(int[] a, int[] b, int base) { int[] result = new int[] {0}; // zu 0 addieren // Latex: Kopf writeConsole("\\begin{tabular}{"); for (int i = 0; i < a.length+b.length+2; i++) writeConsole("c"); writeConsole("}\n"); // Latex: Erste Zeile writeConsole("& "); for (int i = a.length-1; i >= 0; i--) writeConsole(intToChar(a[i]) + " & "); writeConsole("$\\ast$"); for (int i = b.length-1; i >= 0; i--) writeConsole(" & " + intToChar(b[i])); writeConsole("\\\\\n\\hline\n"); // Multipliziere a mit jeder Ziffer von b (von der niedrigsten zur höchsten). for (int i = 0; i < b.length; i++) { int[] partialResult = mulDigit(a, b[i], i, base); // Latex: Teilergebnis (Summand) writeConsole("+"); for (int j = a.length+b.length - partialResult.length; j >= 0; j--) writeConsole(" &"); for (int j = partialResult.length-1; j >= 0; j--) writeConsole(" & " + intToChar(partialResult[j])); writeConsole("\\\\\n"); result = add(result, partialResult, base); } // Latex: Endergebnis writeConsole("\\hline\n="); for (int j = a.length+b.length - result.length; j >= 0; j--) writeConsole(" &"); for (int j = result.length-1; j >= 0; j--) writeConsole(" & " + intToChar(result[j])); writeConsole("\\\\\n\\end{tabular}"); return result; } // Prüft, ob Eingabe mit entsprechender Basis passend public static boolean isValid(int[] number, int base) { for (int digit : number) if (digit >= base) return false; return true; } // Hilfsfunktion: Macht aus eines Zahl die jeweiligen Ziffer public static char intToChar(int digit) { if (digit >= 10) return (char) ('A' + digit-10); // A-Z return (char) ('0' + digit); // 0-9 } // 6. public static void main(String[] args) { int base = read("Bitte wählen Sie eine Basis:"); while (base < 2 || base > 36) base = read("Es sind nur die Basen 2-36 erlaubt. Bitte Basis eingeben:"); int[] a = readNumber(); while (!isValid(a, base)) { write("Diese Eingabe enthält ungültige Ziffern."); a = readNumber(); } int[] b = readNumber(); while (!isValid(a, base)) { write("Diese Eingabe enthält ungültige Ziffern."); b = readNumber(); } add(a, b, base); mul(a, b, base); } }