Развернуть натуральное число задом наперед. Например, 1999 должно превратиться в 9991.
Решение. Мы уже умеем разбивать число на отдельные цифры и собирать из отдельных цифр число. Осталось только вспомнить, что при разборке цифры "отваливаются" с конца числа, а при сборке удобнее брать их с начала, и сообразить, что конец исходного числа соответствует началу того, которое требуется получить.
Для разнообразия напишем функцию на КуМире.
алг цел развернуть число (цел число)
дано число > 0
надо | знач= число "задом наперед" нач цел копия
|КуМир не разрешает изменять
| значения аргументов
знач: = 0
копия:= число
нц пока копия > 0
|знач:= 10*знач + mod(копия, 10)
копия: = div(копия,10)
кц
кон
Контрольный вопрос. Какой результат выдаст эта функция, если вызвать ее с аргументом, равным 2000? Как вы считаете, можно ли считать, что в этом случае разворот выполняется корректно?
Задача 6 Вычеркнуть из натурального числа все вхождения цифры, которая встречается в этом числе чаще других. Если несколько цифр встречаются одинаково часто, вычеркнуть наибольшую из них. Если вычеркнутыми окажутся все цифры, считать результат равным нулю.
Решение. Перед нами типичная задача-многоходовка. Надо составить план решения, разбить задачу на части, а потом разбираться с каждой частью отдельно.
Очевидных этапов решения три:
— подсчитать, сколько раз встречается в исходном числе каждая цифра;
— определить самую популярную цифру;
— преобразовать число, вычеркивая нужную цифру.
Для выполнения первого этапа (подсчет количества каждой цифры) можно завести массив из 10 элементов, которые будут соответствовать цифрам от 0 до 9, и разобрать число по цифрам, каждый раз увеличивая соответствующий очередной цифре элемент массива.
На втором этапе (определение самой популярной цифры) задача сводится к стандартному поиску максимального элемента в массиве.
Самый трудный — третий этап. Нужно разобрать число и собрать его снова, удалив при этом "лишние детали". Причем собрать нужно не в обратном, а в исходном порядке. Это значит, что нужно либо научиться собирать число с конца, либо где-то хранить полученные при разборке цифры до того момента, пока они понадобятся.
Попробуем реализовать оба варианта. Для сборки числа с конца можно применить такой прием. Будем учитывать позиционный множитель, который равен 1 для последней цифры и в 10 раз больше для каждой следующей. Умножая цифры на этот множитель, мы получим нужное число.
Можно реализовать и временное хранение. Вполне подходящим местом для него может стать рекурсивный стек.
Теперь попробуем воплотить все сказанное в программе.
алг удалить популярную цифру (арг цел X, рез цел Y)
дано Х>0
надо | Y получен из Х вычеркиванием самой | популярной цифры
нач цел сколько[0:9]
| сколько раз встречается каждая
| цифра
цел цифра | самая частая цифра в Х анализ количества цифр (X, сколько) цифра:= imax (0, 9, сколько)
Y:= удалить цифру (X, цифра)
кон
алг анализ количества цифр (арг цел число, рез цел таб ц[0:9])
дано число > 0
надо | элементы ц[i] показывают, сколько
| раз встречается цифра i в записи
| числа
нач цел i | счетчик для перебора
цел копия, цифра
нц для i<от 0 до 9
| сколько[i]:= 0
кц
копия:= число
нц пока копия > О
цифра:= mod(копия,10)
ц[цифра]:== ц[цифра]+1
копия:== div(копия,10)
кц
кон
алг цел imax (арг цел низ, верх,
цел таб а[низ:верх])
дано
надо | знач = индекс наибольшего элемента
| в таблице а. Если наибольших
| элементов несколько, берется последний
нач цел i
знач:=низ
нц для i от низ+1 до верх
если a[i] >= а[знач]
| то знач:= i все
кц
кон
алг цел удалить цифру {арг цел число, цифра)
| вариант 1
дано число > О
надо | знач = число, из которого вычеркнуты | заданные цифры
нач цел копия, множитель, ц копия:= число знач:= 0 множитель:= 1 нц пока копия > 0 ц: = mod(копия,10) если ц <> цифра то знач:= знач + множитель*ц множитель:= множитель*10 все копия:== div(копия,10) кц кон
алг цел удалить цифру (арг цел число, цифра)
| вариант 2
дано число >= 0
надо | знач = число, из которого вычеркнуты
| заданные цифры
нач цел ц
если число = 0 то знач:= 0 иначе
ц:== mod(число,10)
если ц = цифра то знач:= удалить цифру
(div(число,10),цифра)
иначе знач:== удалить цифру
(div(число,10), цифра)*10 + ц
все все кон
Контрольные вопросы
Почему в функции imax в сравнении использован знак >=? Что будет, если заменить ею на >?
За счет чего в рекурсивном варианте функции "удалить цифру" удалось о6ойтись без множителя и копии? Что их заменяет?
Задачи для самостоятельного решения
1. В заданном натуральном числе поменять местами первую и последнюю цифры.
2. Вывести целое число в столбик, по одной цифре в каждой строке.
3. Переставить цифры заданного числа так, чтобы получилось:
а) наибольшее возможное число;
б) наименьшее возможное число.
|