Акела – большой серый волк-одиночка, благодаря своей силе
и хитрости стал вожаком стаи. Двенадцать лет Одинокий Волк водил стаю на охоту
и с охоты, и за всё это время никто, ни один волк не попался в ловушку.
Акела постарел, стал слабее, и
теперь хромой тигр Шерхан подружился с младшими волками стаи и те часто бегали
за ним; Акела не допустил бы до этого, если бы прежняя сила дала ему
возможность как следует проявлять свою власть.
С годами стал Акела подзабывать и
Закон Джунглей. Нет, он не мог его нарушить, ибо Закон Джунглей уже давно стал
частью его инстинктов, кроме того, он точно помнил контрольную сумму Закона.
И вот, молодые оппозиционные
волки вместе с Шерханом, решили внести поправки и дополнения в этот Закон, так
сказать расширить и дополнить. Можно только догадываться зачем им это
понадобилось, и так как, к счастью, поправки были отклонены самим Хатхи,
Джунгли могут спать спокойно.
Но все-таки интересно, как же мог
выглядеть основной Закон с поправками и дополнениями оппозиционных волков, если
известно, что его контрольная сумма при этом не изменилась.
Вход. Натуральное число n (1 ≤ n ≤ 10100) – Закон
Джунглей.
Выход. Вывести самое маленькое натуральное число m > n с такой же контрольной суммой (суммой цифр), как и у числа n – Закон Джунглей в редакции
оппозиционных волков во главе с Шерханом.
Пример входа
77
Пример выхода
86
РЕШЕНИЕ
математика - экстремум
Найдем самую правую (последнюю)
ненулевую цифру и уменьшим ее на 1. Далее слева от нее найдем цифру, которую
можно увеличить на 1 (то есть не девятку). Все цифры, находящиеся за той,
которую увеличили на 1, отсортируем по возрастанию. Так получим искомое наименьшее
число с такой же контрольной суммой, как и исходное.
Пример
Объявим
символьный массив, в котором будем хранить входное число.
char s[200];
Считываем
входное число в массив s, начиная с первой (не нулевой) позиции. Вычисляем
длину строки len.
s[0] = '0';
gets(s+1); len = strlen(s); cur = len - 1;
Ищем
первую с конца ненулевую цифру.
while(s[cur] == '0') cur--;
Уменьшаем
ее на 1.
s[cur--]--;
Ищем
слева от уменьшенной цифры такую, которую можно увеличить на 1. То есть
пропускаем все девятки.
while(s[cur] == '9') cur--;
Увеличиваем
цифру на 1.
s[cur]++;
Сортируем
цифры.
sort(s+cur+1,s+len);
Выводим
результат. Если в нулевой позиции (ведущим) стоит ноль, то не выводим его.
puts(s + (s[0] == '0'));