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)
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)
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;
}
}
Y2xhc3MgSWRlb25lIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQl0ZXN0KDEzNTc5MjQpOwoJCXRlc3QoOTg3NDMyMDY4MDY0Njk4NzRMKTsKCX0KCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdChsb25nIG51bWJlcikgewoJCWxvbmcgbGFyZ2VzdE51bWJlciA9IHNvcnREaWdpdHMobnVtYmVyKTsKCQlsb25nIHNtYWxsZXN0TnVtYmVyID0gcmV2ZXJzZVNhbWVTaXplKGxhcmdlc3ROdW1iZXIpOwoJCVN5c3RlbS5vdXQucHJpbnRmKCIlZDogbGFyZ2VzdCA9ICVzLCBzbWFsbGVzdCA9ICVkJW4iLCBudW1iZXIsIGxhcmdlc3ROdW1iZXIsIHNtYWxsZXN0TnVtYmVyKTsKCX0KCXByaXZhdGUgc3RhdGljIGxvbmcgcG93MTAoaW50IG4pIHsKCQlpZiAobiA8IDAgfHwgbiA+IDE4KQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHBvbmVudCBvdXRzaWRlIHZhbGlkIHJhbmdlICgwLTE4KTogIiArIG4pOwoJCWxvbmcgciA9IDE7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJCXIgKj0gMTA7IAoJCXJldHVybiByOwoJfQoJcHJpdmF0ZSBzdGF0aWMgaW50IGRpZ2l0QXQobG9uZyBudW1iZXIsIGludCBpbmRleCkgewoJCXJldHVybiAoaW50KSAobnVtYmVyIC8gcG93MTAoaW5kZXgpICUgMTApOwoJfQoJcHJpdmF0ZSBzdGF0aWMgbG9uZyBzb3J0RGlnaXRzKGxvbmcgbnVtYmVyKSB7CgkJaWYgKG51bWJlciA8PSAwKQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW1iZXIgbXVzdCBiZSBub24temVybyBwb3NpdGl2ZSBpbnRlZ2VyIik7CgkJaW50IHNpemUgPSAxOwoJCWZvciAobG9uZyBuID0gbnVtYmVyOyBuID4gOTsgbiAvPSAxMCkKCQkJc2l6ZSsrOwoJCWxvbmcgbiA9IG51bWJlcjsKCQlmb3IgKGludCBqID0gc2l6ZSAtIDE7IGogPiAwOyBqLS0pIHsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKCQkJCWludCBhID0gZGlnaXRBdChuLCBpKTsKCQkJCWludCBiID0gZGlnaXRBdChuLCBpKzEpOwoJCQkJaWYgKGEgPiBiKQoJCQkJCW4gKz0gKChhIC0gYikgKiAxMCAtIChhIC0gYikpICogcG93MTAoaSk7CgkJCX0KCQl9CgkJcmV0dXJuIG47Cgl9Cglwcml2YXRlIHN0YXRpYyBsb25nIHJldmVyc2VTYW1lU2l6ZShsb25nIGxhcmdlc3ROdW1iZXIpIHsKCQlsb25nIG4gPSBsYXJnZXN0TnVtYmVyOwoJCWlmIChuICUgMTAgPT0gMCkgewoJCQlpbnQgaSA9IDA7CgkJCWZvciAoOyBuICUgMTAgPT0gMDsgbiAvPSAxMCwgaSsrKSB7Lypsb2NhdGUgbGVhc3Qgbm9uLXplcm8gZGlnaXQqL30KCQkJbiA9IG4gLyAxMCAqIHBvdzEwKGkgKyAxKSArIG4gJSAxMDsgLy8gY2xlYXIgbGVhc3QgZGlnaXQgYW5kIGFkZCBhdCBpbmRleCAwCgkJfQoJCXJldHVybiByZXZlcnNlKG4pOwoJfQoJcHJpdmF0ZSBzdGF0aWMgbG9uZyByZXZlcnNlKGxvbmcgbnVtYmVyKSB7CgkJbG9uZyByID0gMDsKCQlmb3IgKGxvbmcgbiA9IG51bWJlcjsgbiAhPSAwOyBuIC89IDEwKQoJCQlyID0gciAqIDEwICsgbiAlIDEwOwoJCXJldHVybiByOwoJfQp9