Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Развернуть натуральное число задом наперед. Например, 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. Переставить цифры заданного числа так, чтобы получилось:

 

а) наибольшее возможное число;

 

б) наименьшее возможное число.

 







Дата добавления: 2015-08-30; просмотров: 649. Нарушение авторских прав; Мы поможем в написании вашей работы!




Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

Краткая психологическая характеристика возрастных периодов.Первый критический период развития ребенка — период новорожденности Психоаналитики говорят, что это первая травма, которую переживает ребенок, и она настолько сильна, что вся последую­щая жизнь проходит под знаком этой травмы...

РЕВМАТИЧЕСКИЕ БОЛЕЗНИ Ревматические болезни(или диффузные болезни соединительно ткани(ДБСТ))— это группа заболеваний, характеризующихся первичным системным поражением соединительной ткани в связи с нарушением иммунного гомеостаза...

Менадиона натрия бисульфит (Викасол) Групповая принадлежность •Синтетический аналог витамина K, жирорастворимый, коагулянт...

Разновидности сальников для насосов и правильный уход за ними   Сальники, используемые в насосном оборудовании, служат для герметизации пространства образованного кожухом и рабочим валом, выходящим через корпус наружу...

Дренирование желчных протоков Показаниями к дренированию желчных протоков являются декомпрессия на фоне внутрипротоковой гипертензии, интраоперационная холангиография, контроль за динамикой восстановления пассажа желчи в 12-перстную кишку...

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия