5.02 Запись числа в другой системе счисления
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится троичная запись числа N.
2. Подсчитывается сумма количества единиц и двоек троичной записи. Если полученное значение чётно, то справа к этой записи дописывается 0, если нечётно – 1.
3. К полученному результату дописывается ещё один бит по тем же правилам.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа )
является троичной записью искомого числа
. Укажите минимальное число
, большее 337, которое
может быть получено в результате работы этого алгоритма. В ответе это число запишите в десятичной
системе.
В условии задачи нам дан алгоритм, который преобразует натуральное число N в новое число R через операции над троичной записью N. Сначала мы реализуем функцию tr, которая переводит число N в его троичную запись — строку с цифрами 0, 1 и 2. Для этого мы последовательно делим число на 3, собирая остатки от деления, и формируем строку с цифрами в правильном порядке. Далее для каждого числа N от 1 до 99 мы получаем троичную запись, затем считаем сумму количества цифр 1 и 2. Если эта сумма чётна, к записи справа дописываем «0», иначе «1». После этого повторяем подсчёт суммы цифр 1 и 2 для обновлённой записи и аналогично добавляем ещё один символ «0» или «1». Таким образом мы увеличиваем длину записи на два символа. После этого полученную строку интерпретируем как троичное число и переводим в десятичную систему. В процессе перебора мы сохраняем минимальное число R, превышающее 337. По завершении цикла выводим это минимальное подходящее число.
def tr(n): x = n # Копируем число N для преобразования в троичную запись s = ’’ # Инициализируем пустую строку для троичной записи while x > 0: # Пока число не уменьшится до 0 s = str(x % 3) + s # Добавляем остаток от деления на 3 слева к строке x = x // 3 # Делим число на 3 без остатка для следующей итерации return s # Возвращаем полученную троичную запись mn = 10**10 # Инициализируем переменную для хранения минимального подходящего числа очень большим значением for n in range(1, 100): # Перебираем числа от 1 до 99 включительно t = tr(n) # Получаем троичную запись числа N # Подсчитываем сумму количества цифр ’1’ и ’2’ в записи if (t.count(’1’) + t.count(’2’)) % 2 == 0: t += ’0’ # Если сумма чётна, дописываем ’0’ else: t += ’1’ # Иначе дописываем ’1’ # Повторяем подсчёт суммы для новой записи с добавленным символом if (t.count(’1’) + t.count(’2’)) % 2 == 0: t += ’0’ # Если сумма чётна, дописываем ’0’ else: t += ’1’ # Иначе дописываем ’1’ # Переводим полученную троичную запись в десятичное число if int(t, 3) > 337: # Если число больше 337 mn = min(mn, int(t, 3)) # Обновляем минимальное подходящее число print(mn) # Выводим минимальное число R, большее 337
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

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

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

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

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

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!