import java.io.*; import java.math.*; public class OffBase { public static final int MAX_RADIX = 40; public static final int MIN_RADIX = 2; public static final char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '?', '~', '#', '|', }; String n1 = ""; String n2 = ""; String n3 = ""; int minRadix, sign; int target = 1; char c; PrintStream out; public final int PLUS = 1; public final int MINUS = 2; public OffBase (){ /* stdin/stdout */ ACMIO in = ACMIO.getStdin(); out = System.out; /* file I/O ACMIO in = new ACMIO("OffBase.in"); out = null; try { out = new PrintStream(new FileOutputStream("OffBase.txt")); } catch (FileNotFoundException fnfe){ } */ int i = 1; while (!in.isEOF()){ if (in.isEOLN()) { processEquation(i++, n1, n2, n3, sign, minRadix+1); n1 = ""; n2 = ""; n3 = ""; sign = 0; minRadix = 0; target = 1; in.skipLine(); } else if (target == 1) { c = in.charRead(); if (c == '+') { sign = PLUS; target = 2; } else if (c == '-') { sign = MINUS; target = 2; } else { n1 = n1.concat(String.valueOf(c)); minRadix = setMax(minRadix, valueOf(c, OffBase.MAX_RADIX)); } } else if (target == 2) { c = in.charRead(); if (c == '=') { target = 3; } else { n2 = n2.concat(String.valueOf(c)); minRadix = setMax(minRadix, valueOf(c, OffBase.MAX_RADIX)); } } else { c = in.charRead(); n3 = n3.concat(String.valueOf(c)); minRadix = setMax(minRadix, valueOf(c, OffBase.MAX_RADIX)); } } } public int setMax(int currentMax, int potential){ if (potential > currentMax) return potential; else return currentMax; } public static void main(String[] args) { new OffBase(); } public void processEquation(int caseNum, String num1, String num2, String num3, int op, int minRadix){ boolean abort = false; BigInteger dec1, dec2, dec3; for (int i = minRadix; i <= OffBase.MAX_RADIX; i++) { abort = false; dec1 = baseNToBase10(num1, i); dec2 = baseNToBase10(num2, i); dec3 = baseNToBase10(num3, i); if (dec1 == null || dec2 == null || dec3 == null) { abort = true; } if (op == PLUS && !abort) { if (dec1.add(dec2).equals(dec3)){ out.println("Case " + caseNum + ": minimum base is " + i); return; } } else if (!abort){ if (dec1.subtract(dec2).equals(dec3)){ out.println("Case " + caseNum + ": minimum base is " + i); return; } } } out.println("Case " + caseNum + ": expression is invalid."); } public int valueOf(char c, int radix) { for (int i = 0; i < radix; i++) { if (c == OffBase.digits[i]) return i; } return -1; } public BigInteger baseNToBase10(String s, int radix) { BigInteger rdx = new BigInteger(String.valueOf(radix)); if (s == null) { return null; } if (radix < OffBase.MIN_RADIX || radix > OffBase.MAX_RADIX){ return null; } BigInteger result = new BigInteger("0"); int digitValue; for(int i = 0; i < s.length(); i++){ digitValue = valueOf(s.charAt(i), radix); if (digitValue == -1) return null; if (i != 0) { result = result.multiply(rdx); } result = result.add(new BigInteger(String.valueOf(digitValue))); } return result; } }// OffBase