public class BaseNumber { int base; Digit list; public BaseNumber(int value) { base = 10; list = listInBase(10, value); } BaseNumber(int base, Digit list) { this.base = base; this.list = list; } Digit listInBase(int base, int n) { if (n == 0) return new Digit(0,null); else { Digit ls = null; while (n != 0) { ls = new Digit(n % base, ls); n /= base; } return ls; } } public int toInt() { // uses Horner's method Digit ls = list; int result = 0; while (ls != null) { result = (result * base) + ls.number; ls = ls.next; } return result; } public BaseNumber toBase(int b) { // 2 <= b <= 10 return new BaseNumber(b, listInBase(b, toInt())); } public BaseNumber plus(BaseNumber x) { return new BaseNumber(toInt() + x.toInt()); } public BaseNumber times(BaseNumber x) { return new BaseNumber(toInt() * x.toInt()); } public String toString() { return ("" + list + " base " + base); } } class Digit { int number; Digit next; Digit(int n, Digit next) { number = n; this.next = next; } public String toString() { if (next == null) return "" + number; else return "" + number + next; } }