1. Введение
В задании №5 исполнитель получает натуральное число N и по описанному алгоритму строит новое число R.
Обычно нужно найти:
- минимальное или максимальное
N; - количество подходящих
N; - значение
R.
Задание проверяет умение:
- переводить число в нужную систему счисления и обратно;
- обрабатывать запись числа как строку;
- точно переносить ветвление «если — иначе» в код;
- перебирать значения
Nв правильных границах; - различать исходное число
N, строку записиrи итоговое числоR.
Главная идея: сначала строим строку записи числа, затем меняем именно строку по условию и только после этого переводим результат обратно в десятичное число.
2. Теория
Системы счисления в Python
Для двоичной, восьмеричной и шестнадцатеричной записей в Python есть готовые функции:
bin()
oct()
hex()
Десятичную строку получают через:
str(n)
а само значение n уже является обычным целым числом Python.
| Основание | Получить запись | Результат функции | Чистая запись |
|---|---|---|---|
| 2 | bin(n) | '0b1101' | bin(n)[2:] |
| 8 | oct(n) | '0o15' | oct(n)[2:] |
| 16 | hex(n) | '0x1f' | hex(n)[2:] |
Почему нужен срез [2:]
Например:
bin(13)
возвращает:
0b1101
Первые два символа 0b — служебный префикс, а нам нужны только цифры двоичной записи.
Поэтому используем:
bin(13)[2:]
Получим:
1101
Важно: правильный срез —
[2:], а не[:2].
[2:] означает: взять строку с позиции 2 до конца.
bin(13)[2:]
даёт:
1101
А:
bin(13)[:2]
оставит только:
0b
Перевод строки обратно в число
Функция:
int(строка, k)
читает строку как запись числа в системе с основанием k и возвращает обычное целое число Python.
Например:
int('1101', 2)
даст:
13
Основание k указывают обязательно, если строка записана не в десятичной системе.
Для стандартной задачи №5 обычно используют основания от 2 до 36.
Как изменять строку
После перевода запись хранится в переменной r или s как строка.
Поэтому к ней можно приписывать символы и заменять отдельные части срезами.
Пусть:
s = '101101'
Дописать символы в начало
s = '11' + s
Получим:
11101101
Дописать символы в конец
s = s + '00'
Получим:
10110100
Вставить символ в середину
Сначала находим середину строки:
i = len(s) // 2
Затем собираем новую строку:
s = s[:i] + '0' + s[i:]
Срез:
s[:i]
берёт символы до позиции i, а:
s[i:]
берёт символы с позиции i до конца.
Поэтому формула работает при любой длине строки, а не только для конкретного количества цифр.
Заменить первые два символа
s = '00' + s[2:]
Заменить последние два символа
s = s[:-2] + '00'
Если требуется заменить только определённые позиции, срезы надёжнее метода
replace().
Например:
s.replace('1', '0')
заменит все найденные единицы, а не только первую или первые две.
Если основание не равно 2, 8 или 16
Для троичной, пятеричной и другой системы пишем функцию перевода.
alf = sorted('1234567890QWERTYUIOPASDFGHJKLZXCVBNM')
def to_base(n, base):
if n == 0:
return '0'
s = ''
while n > 0:
s = alf[n % base] + s
n //= base
return s
Строка alf содержит цифры и буквы. После sorted() символы располагаются в порядке:
0–9, A–Z
3. Шаги решения задачи кодом
-
Определить, что требуется вывести:
N,Rили количество подходящих значений. От этого зависит, что сохранять после проверки. -
Задать перебор
N. Для минимальногоNидём по возрастанию; границы из условия переносим вrangeбез потери правого конца. -
Получить строку записи
N:
bin(n)[2:]
oct(n)[2:]
hex(n)[2:]
to_base(n, base)
- Вычислить условие до изменения строки именно по условию задачи:
n % 2
n % 3
len(r) % 2
r.count('1') % 2
и так далее.
- Собрать новую строку конкретной операцией.
В начало:
prefix + r
В конец:
r + suffix
В середину:
r[:len(r) // 2] + fragment + r[len(r) // 2:]
- Выполнить:
R = int(r, base)
После этого проверить ограничение и сохранить нужную величину.
Для минимального N при возрастающем переборе обычно достаточно:
print(n)
break
Для максимального R сохраняем именно R.
Шаблон для основания 2, 8 или 16
for n in range(1, 10000):
r = bin(n)[2:]
if условие_для_n:
r = ...
else:
r = ...
R = int(r, 2)
if условие_для_R:
print(n)
break
Для восьмеричной системы заменяем bin на oct и основание 2 в int на 8.
Для шестнадцатеричной — hex и 16.
Шаблон для другого основания
alf = sorted('1234567890QWERTYUIOPASDFGHJKLZXCVBNM')
def to_base(n, base):
if n == 0:
return '0'
s = ''
while n > 0:
s = alf[n % base] + s
n //= base
return s
base = 3
for n in range(1, 10000):
r = to_base(n, base)
if условие_для_n:
r = ...
else:
r = ...
R = int(r, base)
if условие_для_R:
print(n)
break
4. Практика с решениями
Задача 1. Основная волна 2026 (день 1)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
- Строится двоичная запись числа
N. - Далее эта запись обрабатывается по следующему правилу:
- если число
Nчётное, то к этой записи справа и слева дописываются по две единицы; - если число
Nнечётное, то в конец двоичной записи справа дописываются два нуля, а в начало слева дописывается единица.
- если число
- Результат переводится в десятичную систему и выводится на экран.
Укажите наибольшее число R, не превышающее 113, которое может быть результатом работы данного алгоритма.
Ключевой момент
В ответе требуется максимальное R, поэтому сохраняем R, а не исходное N.
После перебора выводим max(values).
Решение на Python
values = []
for n in range(1, 10000):
r = bin(n)[2:]
if n % 2 == 0:
r = '11' + r + '11'
else:
r = '1' + r + '00'
R = int(r, 2)
if R <= 113:
values.append(R)
print(max(values))
Ответ: 108
Задача 2. Троичная запись
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
- Строится троичная запись числа
N. - Если число
Nделится на3, то слева к записи приписывается1, а справа —02. - Если число
Nна3не делится, то остаток от деления на3умножается на5, переводится в троичную систему и дописывается справа. - Полученная запись переводится обратно в десятичную систему.
Например, для 11₁₀ = 102₃ результатом является 102101₃ = 307₁₀, а для 12₁₀ = 110₃ — 111002₃ = 353₁₀.
Укажите минимальное число N, после обработки которого получается число R, не меньшее 177.
Ключевой момент
В ветви else в троичную систему переводим выражение (n % 3) * 5, а не само N.
Решение на Python
alf = sorted('1234567890QWERTYUIOPASDFGHJKLZXCVBNM')
def to_base(n, base):
if n == 0:
return '0'
s = ''
while n > 0:
s = alf[n % base] + s
n //= base
return s
for n in range(1, 1000):
r = to_base(n, 3)
if n % 3 == 0:
r = '1' + r + '02'
else:
r += to_base((n % 3) * 5, 3)
R = int(r, 3)
if R >= 177:
print(n)
break
Ответ: 8
Задача 3. Досрочная волна 2026
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R.
Сначала строится двоичная запись числа N. Затем к ней справа два раза дописывается остаток от деления суммы цифр текущей записи на 2.
Например, запись 11100 после первого шага превращается в 111001. После этого сумма цифр считается уже для новой записи.
Для 12₁₀ = 1100₂ результат равен 110000₂ = 48₁₀, а для 7₁₀ = 111₂ — 11110₂ = 30₁₀.
Укажите наименьшее число N, для которого результат работы алгоритма больше 253.
Ключевой момент
Операция выполняется два раза подряд. Перед вторым добавлением нужно заново посчитать количество единиц уже в изменённой строке.
Решение на Python
for n in range(1, 1000):
r = bin(n)[2:]
for _ in range(2):
digit = r.count('1') % 2
r += str(digit)
R = int(r, 2)
if R > 253:
print(n)
break
Ответ: 64
Задача 4. Сборник задач Крылова 2026
На вход алгоритма подаётся натуральное число N.
- Строится двоичная запись числа
N. - Если количество цифр в записи чётное, в середину дописывается
1. - Если количество цифр нечётное, запись не изменяется.
- Полученная запись переводится обратно в десятичную систему.
Например, для 5₁₀ = 101₂ запись не меняется и R = 5. Для 2₁₀ = 10₂ получаем 110₂ = 6₁₀.
Укажите минимальное число N, после обработки которого получается R ≥ 26.
Ключевой момент
Позиция середины зависит от длины строки, поэтому используем:
mid = len(r) // 2
А новую строку собираем так:
r = r[:mid] + '1' + r[mid:]
Решение на Python
for n in range(1, 200):
r = bin(n)[2:]
if len(r) % 2 == 0:
mid = len(r) // 2
r = r[:mid] + '1' + r[mid:]
R = int(r, 2)
if R >= 26:
print(n)
break
Ответ: 12