Задание 5:
алгоритм достраивает число

Алгоритм смотрит на запись числа N, выбирает одну из двух веток и достраивает запись. Получается R.
Решаем программой: разобрать правило, перевести его в цикл, забрать ответ.

Базовый уровень, один балл. Ответ — одно целое число.

как это устроено

Одно число, четыре действия

Правило (демоверсия 2027)

Строится двоичная запись N. Дальше:

  • а) если N чётное — слева и справа дописываются по две единицы;
  • б) если N нечётное — справа два нуля, слева единица.

Полученная запись — это R в двоичной системе.

как читать условие

Признак и две ветки

В любом варианте условие устроено одинаково. Меняются три вещи — их и надо выписать первыми, ещё до кода.

Что меняетсяЧто бывает (по 13 разобранным вариантам)
система записидвоичная (9 задач), троичная (4)
признак ветвлениячётность самого N; чётность суммы цифр записи; делимость N на 3
что делает веткадописать цифры слева или справа; дописать цифру и заменить два левых разряда; дописать последние цифры самой записи; сосчитать число (остаток или сумму цифр), умножить, перевести и дописать
инструмент

Перевод в другую систему счисления

В двоичную — уже есть в Python

s = f'{n:b}'        # короткий способ
s = bin(n)[2:]      # bin даёт '0b1101',
                    # срез убирает приставку

В троичную — пишем сами

def to3(n):
    s = ''
    while n > 0:
        s = str(n % 3) + s
        n = n // 3
    return s
каркас

Правило превращается в цикл

for n in range(1, 1001):
    s = f'{n:b}'
    if n % 2 == 0:
        t = '11' + s + '11'
    else:
        t = '1' + s + '00'
    r = int(t, 2)
    #print(n, s, t, r)
  • признак — это if;
  • две ветки — if и else;
  • дописать — склейка строк;
  • перевести обратно — int(t, 2).
ветки

Ещё две ветки — и как они пишутся

Дописать последние цифры

«…к записи справа дописываются её три последние двоичные цифры»

t = s + s[-3:]

Дописать цифру и заменить два левых разряда

«…справа дописывается 0, а затем два левых разряда заменяются на 10» (на другой ветке — 1 и 11)

if ds(s) % 2 == 0:
    t = '10' + (s + '0')[2:]
else:
    t = '11' + (s + '1')[2:]
проверка

Сначала убедиться, что алгоритм прочитан верно

Строка отбора пока не написана: сперва печатаем след цикла и сверяем с примером из условия.

for n in range(1, 101):   # пока немного
    s = f'{n:b}'
    if n % 2 == 0:
        t = '11' + s + '11'
    else:
        t = '1' + s + '00'
    r = int(t, 2)
    print(n, s, t, r)

Печатаем все четыре величины: число, его запись, достроенную запись и результат.

Строки следа на экране:

nstr
21011101159
3111110028
41001110011115
510111010052
61101111011123
…
1311011110100116

Сверять надо обе ветки. Примеров в условии всегда два — по одному на ветку: 6 → 123 (а) и 13 → 116 (б). Обе строки в следе совпали. Одного примера мало: ошибка в другой ветке им не ловится.

разбор

Демоверсия 2027: наименьшее R больше 95

def to2(n):
    return f'{n:b}'

best = 10 ** 9   # больше любого R
for n in range(1, 1001):
    s = to2(n)
    if n % 2 == 0:
        t = '11' + s + '11'
    else:
        t = '1' + s + '00'
    r = int(t, 2)
    #print(n, s, t, r)
    if r > 95 and r < best:
        best = r
print(best)
как ещё пишут

Поиск наименьшего и наибольшего: две записи

Вначале в переменную кладём значение, противоположное искомому: ищем наименьшее — заведомо большое, наибольшее — ноль.

Начальное значение и <, >

best = 10 ** 9   # больше любого R
    ...
    if r > 95 and r < best:
        best = r
print(best)

Начальное значение и min, max

best = 10 ** 9   # больше любого R
    ...
    if r > 95:
        best = min(best, r)
print(best)
замер

Шесть вопросов — и все шесть будут сегодня

Что спрашивали в 13 разобранных вариантах. Каркас общий, меняется строка отбора:

ВопросРазСтрока отбора
наименьшее R больше T3 if r > T and r < best: best = r
то же, но нечётное R2 добавляется and r % 2 == 1
наибольшее R не больше T1 if r <= T and r > best: best = r
наименьшее N с R ≥ T4 if r >= T and n < best: best = n
наибольшее N с R ≤ T2 if r <= T and n > best: best = n
наибольшее N, R ближе всего к T1 d = abs(r - T), затем if d <= dist:
ловушка 1

best = n или best = r?

Как теряют балл

Программа написана правильно, цикл верный — а сохраняется не то число, которое спросили.

Проверяющей машине всё равно, что решено верно: ответ не совпал.

Как не терять

Подчеркнуть в условии последнее предложение — там сказано, что указать.

Написав print(best), вернуться к подчёркнутому: спросили N — в best должно лежать n.

ловушка 2

Где проходит граница

Четыре формулировки — четыре разных знака в условии отбора.

В условииВ программеПорог 100 подходит?
R, превышающее 100r > 100 нет
R, не меньшее 100r >= 100 да
R, не превышающее 100r <= 100 да
R, меньшее 100r < 100 нет
троичная запись

Задача целиком: троичная система

def to3(n):
    s = ''
    while n > 0:
        s = str(n % 3) + s
        n = n // 3
    return s

def ds(s):
    v = 0
    for c in s:
        v = v + int(c)
    return v
best = 10 ** 9
for n in range(1, 1001):
    s = to3(n)
    if n % 3 == 0:
        t = s + s[-2:]
    else:
        t = s + to3(ds(s) * 2)
    r = int(t, 3)
    #print(n, s, t, r)
    if r > 520 and r % 2 == 1 and r < best:
        best = r
print(best)
практикум

Что дальше на уроке

6 задач — по одной на каждую форму вопроса

Все на экране сразу, порядок свой. Алгоритм в каждой задаче свой — списать у соседа нечего.

Ошибся — появится программа-разбор именно этой задачи и след её работы. Кнопка «Новые числа» даст задачу того же типа.

Отметка

Балл за каждую верно решённую задачу.

6 — «5»
5 — «4»
4 — «3»

Видно и то, сколько сделано с первой попытки.

домой

Домашняя работа

  • шесть задач — по одной на каждую форму вопроса;
  • ошибся — та же форма вопроса с новыми числами, пока не решишь;
  • от четырёх решённых появляется код работы вида PC-XXXX-XXXX и кнопка «Сдать»;
  • вторая кнопка открывает письмо: к коду прикладывается снимок вашей программы и того, что она напечатала.
Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды