Тема 5. Алгоритмы – анализ простейших алгоритмов

5.02 Запись числа в другой системе счисления

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела алгоритмы – анализ простейших алгоритмов
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#75233

На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.

1. Строится четверичная запись числа N.

2. Далее эта запись обрабатывается по следующим правилам:

а) если произведение цифр записи, отличных от 0, кратно 3, то к этой записи справа дописывается 21;

б) если произведение цифр записи, отличных от 0, не кратно 3, то к этой записи справа дописывается 12.

Полученная таким образом запись является четверичной записью искомого числа R.

Например, для исходного числа 1210 = 304  результатом является число 30214 = 20110  , а для исходного числа 510 = 114  результатом является число 11124 = 8610  .

Укажите максимальное число R, не большее 280, которое может быть получено с помощью полученного алгоритма. В ответе запишите это число в десятичной системе счисления.

Показать ответ и решение

В данной задаче нам необходимо реализовать алгоритм преобразования натурального числа N в новое число R на основе четверичной записи N. Для этого мы сначала пишем собственную функцию f, которая переводит десятичное число n в систему счисления с основанием osn (в нашем случае — в четверичную систему). Функция последовательно делит число на основание системы счисления, записывая остатки от деления в строку в обратном порядке, после чего переворачивает строку, получая корректную запись числа.

Далее, в основном цикле, перебирая числа N от 1 до 199, мы переводим каждое число в четверичную запись с помощью функции f. После этого необходимо найти произведение всех цифр этой записи, исключая нули, так как они не влияют на произведение, а также не могут повлиять на кратность произведения числу 3. Для этого мы используем функцию map, которая преобразует строку цифр в список целых чисел, затем в цикле умножаем эти цифры, пропуская нули. После вычисления произведения проверяем, делится ли оно на 3 без остатка — это и есть проверка кратности 3. В зависимости от результата мы либо дописываем в конец четверичной записи ’21’ (если произведение кратно 3), либо ’12’ (если нет). Получившуюся строку далее переводим обратно из четверичной системы в десятичное число, чтобы сравнивать с ограничением 280. Если число R не превышает 280, мы добавляем его в множество, чтобы избежать повторений. В конце выводим максимальное значение из этого множества, которое и будет искомым ответом.

def f(n, osn):  # Функция перевода числа n в систему счисления с основанием osn
    s = ’’  # Инициализируем пустую строку для записи цифр числа в новой системе счисления
    while n > 0:
        s += str(n % osn)  # Добавляем в строку остаток от деления числа n на основание системы счисления
        n //= osn  # Целочисленно делим число n на основание системы счисления, чтобы перейти к следующей цифре
    s = s[::-1]  # Переворачиваем строку, так как цифры добавлялись в обратном порядке
    return s  # Возвращаем полученную строку — корректное представление числа в новой системе счисления

a = set()  # Создаем множество для хранения уникальных значений R, которые удовлетворяют условию
for n in range(1, 200):  # Перебираем числа N от 1 до 199 включительно
    s = f(n, 4)  # Переводим число n в четверичную систему счисления с помощью функции f

    k = map(int, s)  # Преобразуем строку s в последовательность целых чисел — цифр четверичной записи
    mult = 1  # Инициализируем переменную для произведения цифр, отличных от нуля

    for i in k:  # Для каждой цифры i из последовательности
        if i != 0:  # Если цифра не равна нулю, умножаем текущее произведение на эту цифру
            mult *= i

    if mult % 3 == 0:  # Проверяем, делится ли произведение на 3 без остатка
        s += ’21’  # Если делится, дописываем к записи справа ’21’
    if mult % 3 != 0:  # Если не делится
        s += ’12’  # Дописываем к записи справа ’12’

    r = int(s, 4)  # Переводим полученную четверичную запись обратно в десятичное число для сравнения

    if r <= 280:  # Проверяем, что число R не больше 280
        a.add(r)  # Добавляем число R во множество для хранения уникальных значений

print(max(a))  # Выводим максимальное число R, удовлетворяющее условию задачи

Ответ: 278

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!