TL; DR: см. Демонстрацию нижеприведенной логики в IDEONE .
Представьте, что число представляет собой массив цифр, например, с именем d[]
, и сделайте видэтот индекс 0
является самой правой цифрой.
Пузырьковая сортировка переместит более высокие значения в более высокие индексы, поэтому, если мы сохраним эту логику, сортировка d
приведет к желаемому largestNumber
, например 1357924
становится 9754321
.
Предположим, у вас есть метод pow10(n)
, который вычисляет 10 n , затем вы можете получить цифру по любому индексу:
d[i] = number / pow10(i) % 10
Пример:
6 4 2 0 index
↓ ↓ ↓ ↓
number = 1357924
d[4] = 1357924 / pow10(4) % 10
= 1357924 / 10000 % 10
= 135 % 10
= 5
В пузырьковой сортировке вы меняете соседние элементы, если элемент с более низким индексом больше, поэтому сначала нам понадобятся два значения.Допустим, мы делаем это для i = 3
:
6 4 2 0 index
↓ ↓ ↓ ↓
number = 1357924
i = 3
a = d[i] = d[3] = 7
b = d[i+1] = d[4] = 5
Поскольку a > b
, мы должны поменять значения.Мы можем сделать это следующим образом:
1357924
- 7000 Clear digit at i=3
- 50000 Clear digit at i=4
=1300924 Value with digits cleared
+ 70000 Set digit at i=4
+ 5000 Set digit at i=3
=1375924 Value with digits at index 3 and 4 swapped
Формула для этого:
number = number - a * pow10(i) - b * pow10(i+1)
+ a * pow10(i+1) + b * pow10(i)
Который может быть изменен на:
number += ((a - b) * 10 - (a - b)) * pow10(i)
Теперь, когда вы знаетекак получить «значение элемента массива», или d[i]
, и как «поменять местами элементы массива» с помощью приведенной выше формулы, вы записываете это в обычный алгоритм сортировки пузырьков, так что вы можете:
largestNumber = sortDigits(number)
Теперь вы рассчитали наибольшее значение.Чтобы вычислить наименьшее значение, вам нужно просто поменять цифры, но прежде чем сделать это, вам нужно убедиться, что d[0] != 0
:
n = largestNumber, i = 0
while (n % 10 == 0) { // locate least non-zero digit
n /= 10
i++
}
if (i != 0) {
// clear least digit and add at index 0
n = n / 10 * pow10(i + 1) + n % 10
}
Пример:
n = 97500
After loop: n = 975, i = 2
n / 10 = 97
* pow10(i + 1) = 97000
+ n % 10 = 97005
СейчасВы можете вычислить другое необходимое вам значение:
smallestNumber = reverse(n)
См., например, Java обратное значение типа int без использования массива , чтобы узнать, как это сделать.