@dmitriyivvvv

Как, имея число, получить близжайшее большее число, состоящее из тех же цифр?

Имеется ли алгоритм нахождения ближайшего большего числа из цифр исходного числа? Например, дано исходное число 7809, его ближайшее большее будет 7890. Так вот, существует ли такой алгоритм или придется выполнять все возможные перестановки цифр в этом числе и сохранять те которые больше исходного, чтобы затем отсортировать и вывести наименьшее?
Например, число 47651270590822 следующее большее из цифр исходного числа 47651270592028.
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
@dmitriyivvvv Автор вопроса
Ответ найден если кому то интересно, то вот он:
двигаемся справа налево в поисках цифры которая будет меньше предыдущей. Например для 534976 это будет 4. Затем справа от этой цифры ищем наименьшее число которое будет больше этой цифры (> 4) в данном случае это 6>4.Поменяйте их местами. Получим 536974, затем отсортируйте по возрастанию числа после 6 (в данном случае 974 => 479) получим искомое число 536479
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
usdglander
@usdglander
Yipee-ki-yay
Логически рассуждайте.
Ближайшее большее может отличаться в младших разрядах. Поэтому алгоритм следующий:
1. n = 2
2. Берёте n младших разрядов и переставляете их местами.
3. Сравниваете с начальным, если результат не достигнут, то n++ и п.2.
4. Число найдено.
Ответ написан
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Upd. Алгоритм ниже неверный, т.к. не работает в случае, когда необходимо переставить сразу несколько цифр.

Рассматриваем пары неодинаковых цифр в числе.
Взаимной их перестановкой можно увеличить число только когда левая цифра меньше правой. 23 -> 32
Размер увеличения тем меньше, чем правее обе цифры. Они могут идти и не подряд, а, скажем, через одну.

Коэффициент, который требуется минимизировать – это десятичное число из нулей с единицами в этих позициях. Скажем, лучше поменять позиции 2 и 3, чем 4 и 1, т.к. 110 < 1001 Т.е. при переборе позиций меньше всего хотим двигать левую позицию, пока не переберем все варианты правой:
Варианты для 4
0011
0101
0110
1001
1010
1100

Отсюда алгоритм.
  1. справа налево перебираем пары цифр пока не найдётся первая пара, где
    левая меньше правой
  2. меняем их местами.

Всё.
Ответ написан
@SuNbka
Сортировка по возрастанию \ убыванию? после чего берутся предыдущее и следующее числа возле Х (7809) и сравниваются.
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
Рассматривая число как массив цифр
1 Ищем цифру меньшую последней (при сравнениях можно делать перестановки например как в сортировке пузырьком)
2. Переставляем найденную цифру с пузырьком.
3. Сортируем хвост от найденной позиции(например той же сортировкой пузырьком за простоту алгоритма)
1.
903822
903822
903282
902382
За четыре сравнения найден 0
2.
920382
Переставка пузырька с 0
3.
920328
920238
Досортировка
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы