class Ideone {
	public static void main(String[] args) {
		test(1357924);
		test(98743206806469874L);
	}
	private static void test(long number) {
		long largestNumber = sortDigits(number);
		long smallestNumber = reverseSameSize(largestNumber);
		System.out.printf("%d: largest = %s, smallest = %d%n", number, largestNumber, smallestNumber);
	}
	private static long pow10(int n) {
		if (n < 0 || n > 18)
			throw new IllegalArgumentException("Exponent outside valid range (0-18): " + n);
		long r = 1;
		for (int i = 0; i < n; i++)
			r *= 10; 
		return r;
	}
	private static int digitAt(long number, int index) {
		return (int) (number / pow10(index) % 10);
	}
	private static long sortDigits(long number) {
		if (number <= 0)
			throw new IllegalArgumentException("Number must be non-zero positive integer");
		int size = 1;
		for (long n = number; n > 9; n /= 10)
			size++;
		long n = number;
		for (int j = size - 1; j > 0; j--) {
			for (int i = 0; i < j; i++) {
				int a = digitAt(n, i);
				int b = digitAt(n, i+1);
				if (a > b)
					n += ((a - b) * 10 - (a - b)) * pow10(i);
			}
		}
		return n;
	}
	private static long reverseSameSize(long largestNumber) {
		long n = largestNumber;
		if (n % 10 == 0) {
			int i = 0;
			for (; n % 10 == 0; n /= 10, i++) {/*locate least non-zero digit*/}
			n = n / 10 * pow10(i + 1) + n % 10; // clear least digit and add at index 0
		}
		return reverse(n);
	}
	private static long reverse(long number) {
		long r = 0;
		for (long n = number; n != 0; n /= 10)
			r = r * 10 + n % 10;
		return r;
	}
}