fork download
  1. class Ideone {
  2. public static void main(String[] args) {
  3. test(1357924);
  4. test(98743206806469874L);
  5. }
  6. private static void test(long number) {
  7. long largestNumber = sortDigits(number);
  8. long smallestNumber = reverseSameSize(largestNumber);
  9. System.out.printf("%d: largest = %s, smallest = %d%n", number, largestNumber, smallestNumber);
  10. }
  11. private static long pow10(int n) {
  12. if (n < 0 || n > 18)
  13. throw new IllegalArgumentException("Exponent outside valid range (0-18): " + n);
  14. long r = 1;
  15. for (int i = 0; i < n; i++)
  16. r *= 10;
  17. return r;
  18. }
  19. private static int digitAt(long number, int index) {
  20. return (int) (number / pow10(index) % 10);
  21. }
  22. private static long sortDigits(long number) {
  23. if (number <= 0)
  24. throw new IllegalArgumentException("Number must be non-zero positive integer");
  25. int size = 1;
  26. for (long n = number; n > 9; n /= 10)
  27. size++;
  28. long n = number;
  29. for (int j = size - 1; j > 0; j--) {
  30. for (int i = 0; i < j; i++) {
  31. int a = digitAt(n, i);
  32. int b = digitAt(n, i+1);
  33. if (a > b)
  34. n += ((a - b) * 10 - (a - b)) * pow10(i);
  35. }
  36. }
  37. return n;
  38. }
  39. private static long reverseSameSize(long largestNumber) {
  40. long n = largestNumber;
  41. if (n % 10 == 0) {
  42. int i = 0;
  43. for (; n % 10 == 0; n /= 10, i++) {/*locate least non-zero digit*/}
  44. n = n / 10 * pow10(i + 1) + n % 10; // clear least digit and add at index 0
  45. }
  46. return reverse(n);
  47. }
  48. private static long reverse(long number) {
  49. long r = 0;
  50. for (long n = number; n != 0; n /= 10)
  51. r = r * 10 + n % 10;
  52. return r;
  53. }
  54. }
Success #stdin #stdout 0.04s 2184192KB
stdin
Standard input is empty
stdout
1357924: largest = 9754321, smallest = 1234579
98743206806469874: largest = 99888776664443200, smallest = 20034446667788899