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

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

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

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

Задача 1#75231

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

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

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

а) если в записи числа больше четных цифр, то складывается сумма всех четных цифр в записи числа, переводится в восьмеричную систему счисления и дописывается в конец числа;

б) если в записи числа больше нечетных цифр, то складывается сумма всех нечетных цифр в записи числа, переводится в восьмеричную систему счисления и дописывается в конец числа;

в) если в записи числа одинаковое количество четных и нечетных цифр, то складывается сумма всех четных цифр в записи числа и делится нацело на 2, затем переводится в восьмеричную систему счисления и дописывается в конец числа;

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

Например, для исходного числа 12  = 14
  10     8  результатом является число 142 = 98
   8    10  , а для исходного числа 7210 = 1108  результатом является число 11028 = 57810  .

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

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

В этом задании нам необходимо реализовать алгоритм, который строит новое число R по заданному натуральному числу N, используя восьмеричную запись числа N. Сначала мы переводим число N в строку, которая представляет его восьмеричное представление, используя встроенную функцию oct и убирая префикс 0o. Затем подсчитываем количество чётных и нечётных цифр в этой записи — для этого считаем, сколько раз встречаются цифры 0, 2, 4, 6 (чётные) и 1, 3, 5, 7 (нечётные) с помощью функции .count(). После этого мы суммируем соответствующие цифры в зависимости от того, каких цифр больше в записи числа. Если чётных цифр больше, то складываем все чётные цифры, переводим сумму обратно в восьмеричную систему и дописываем полученную строку справа к исходной записи. Если нечётных цифр больше, то аналогично складываем все нечётные цифры, переводим сумму в восьмеричную запись и добавляем её справа. Если количество чётных и нечётных цифр одинаково, то считаем сумму всех чётных цифр, делим её нацело на 2, переводим результат в восьмеричную систему и дописываем справа. После этого полученную новую восьмеричную запись числа R мы переводим обратно в десятичную систему для проверки условия, что R не больше 870. Для всех чисел от 1 до 999, удовлетворяющих этому условию, выводим исходное число N, при этом максимальное из них будет нашим ответом.

for n in range(1, 1000):
    t = oct(n)[2:]  # Перевод числа n в восьмеричную систему счисления (убираем префикс ’0o’)

    # Подсчёт количества чётных и нечётных цифр в восьмеричной записи числа
    count_even = t.count(’0’) + t.count(’2’) + t.count(’4’) + t.count(’6’)
    count_odd = t.count(’1’) + t.count(’3’) + t.count(’5’) + t.count(’7’)

    sum_digits = 0  # Инициализация переменной для суммы цифр

    if count_even > count_odd:  # Если чётных цифр больше
        for i in t:
            if int(i) % 2 == 0:  # Суммируем только чётные цифры
                sum_digits += int(i)
        t += oct(sum_digits)[2:]  # Добавляем к восьмеричной записи число суммы в восьмеричной записи

    elif count_odd > count_even:  # Если нечётных цифр больше
        for i in t:
            if int(i) % 2 != 0:  # Суммируем только нечётные цифры
                sum_digits += int(i)
        t += oct(sum_digits)[2:]  # Добавляем к восьмеричной записи число суммы в восьмеричной записи

    else:  # Если количество чётных и нечётных цифр одинаково
        for i in t:
            if int(i) % 2 == 0:  # Суммируем чётные цифры
                sum_digits += int(i)
        t += oct(sum_digits // 2)[2:]  # Добавляем половину суммы (делённой нацело) в восьмеричной записи

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

    if r <= 870:  # Проверяем условие, что число R не больше 870
        print(n)  # Выводим подходящее значение исходного числа N

Ответ: 108

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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