📚 Теория: Задание 16 ОГЭ — Программирование

💡 Что такое задание 16?

В задании 16 ОГЭ по информатике требуется написать программу на языке программирования (обычно Python) для обработки последовательности натуральных чисел. Задача проверяет умение:

Задача может быть одного из трёх типов, представленных ниже.

🐍 Основы Python

Для успешного выполнения задания 16 необходимо владеть основами языка Python. Полный курс «Основы Python» (от истории языка, типов данных, переменных, условий и циклов до множеств, списков, словарей и списочных выражений) доступен на сайте python.nayanovaacademy.ru.

🧮 Перевод в системы счисления

🔢 Как перевести число в p-ричную систему

Чтобы узнать, как выглядит число в системе счисления с основанием p, нужно последовательно делить число на p и записывать остатки справа налево (от последнего к первому).

N = ak · pk + ak-1 · pk-1 + ... + a0 · p0
Где ai — цифры числа в p-ричной системе (0 ≤ ai < p), а цифра a0последняя (самая правая).

✅ Практический способ проверки последней цифры

Чтобы проверить, оканчивается ли число N на цифру d в p-ричной системе, достаточно найти остаток от деления N на p:

N % p == d
Если это условие выполняется, то последняя цифра числа N в p-ричной системе равна d.

✅ Проверка последних двух цифр

Чтобы проверить, оканчивается ли число N на две цифры ab в p-ричной системе, нужно найти остаток от деления N на p²:

N % (p * p) == a * p + b
Например, для 5-ричной системы: N % 25 == 2*5 + 1 = 11 (окончание 21)

💡 Важно!

  • Последняя цифра числа в p-ричной системе = N % p
  • Последние две цифры числа в p-ричной системе = N % (p²)
  • Предпоследняя цифра = (N // p) % p

📝 Пример

Число 31 в 5-ричной системе:
31 ÷ 5 = 6 (остаток 1) — последняя цифра 1
6 ÷ 5 = 1 (остаток 1)
1 ÷ 5 = 0 (остаток 1)
Результат: 31₁₀ = 111₅ (оканчивается на 1)

Проверка: 31 % 5 = 1 ✓

Предпоследняя цифра числа 112 в 8-ричной системе:
112₁₀ = 160₈
112 // 8 = 14, 14 % 8 = 6 → предпоследняя цифра 6
Проверка: (112 // 8) % 8 = 14 % 8 = 6 ✓

📝 Структура программы (с известным N)

Для задач с известным количеством элементов программа обычно имеет следующую структуру:

# Чтение количества элементов
n = int(input())

# Переменная для суммы/количества
total_sum = 0
# ИЛИ count = 0

# Цикл по всем элементам последовательности
for i in range(n):
    x = int(input())
    if # условие отбора:
        total_sum += x

# Вывод результата
print(total_sum)

🔁 Общий алгоритм:

  1. Считать N — количество элементов
  2. Инициализировать переменную для суммы (или количества)
  3. В цикле N раз считать очередное число
  4. Проверить условие отбора
  5. Если условие выполняется — добавить число к сумме (или увеличить счётчик)
  6. Вывести результат

📝 Структура программы (с сигнальным значением)

В некоторых вариантах задания количество чисел заранее не известно. Признаком конца ввода является особое сигнальное значение — обычно 0 (натуральные числа всегда > 0, поэтому 0 не может быть элементом последовательности). Программа читает числа в цикле while до тех пор, пока не встретит 0.

# Переменная для суммы/количества
total_sum = 0
# ИЛИ count = 0

# Чтение первого числа
x = int(input())
# Цикл пока не встретится сигнальное значение (0)
while x != 0:
    if # условие отбора:
        total_sum += x
    # Чтение следующего числа
    x = int(input())

# Вывод результата
print(total_sum)

🔁 Общий алгоритм:

  1. Инициализировать переменную для суммы (или количества)
  2. Считать первое число
  3. Пока число не равно 0 (сигнальному значению):
  4.   3.1. Проверить условие отбора
      3.2. Если условие выполняется — добавить к сумме
      3.3. Считать следующее число
  5. Вывести результат

⚠️ Важно!

Сигнальное значение (0) не должно обрабатываться — оно только указывает на конец ввода. Проверка условия и добавление к сумме выполняются до чтения следующего числа.

⚙️ Типовые фрагменты кода

1️⃣ Последняя цифра числа в p-ричной системе равна d

if x % p == d:
    total_sum += x

2️⃣ Окончание на две цифры ab в p-ричной системе

if x % (p * p) == a * p + b:
    total_sum += x

3️⃣ Предпоследняя цифра числа в p-ричной системе равна d

if (x // p) % p == d:
    total_sum += x

4️⃣ Подсчёт цифр числа, кратных k

count = 0
temp = x
while temp > 0:
    digit = temp % 10
    if digit % k == 0:
        count += 1
    temp //= 10
print(count)

5️⃣ Сумма цифр числа, удовлетворяющих условию

total = 0
temp = x
while temp > 0:
    digit = temp % 10
    if digit > 7: # или digit % 3 != 0, digit <= 6 и т.д.
        total += digit
    temp //= 10
print(total)

6️⃣ Поиск минимальной/максимальной цифры

min_digit = 9
# ИЛИ max_digit = 0
temp = x
while temp > 0:
    digit = temp % 10
    if digit < min_digit: # для максимума: if digit > max_digit
        min_digit = digit
    temp //= 10
print(min_digit)

✏️ Примеры решения задач

Пример 1: Окончание в 5-ричной системе на цифру 3

Условие: Напишите программу подсчёта суммы элементов последовательности натуральных чисел, запись которых в 5-ричной системе счисления оканчивается на цифру 3. В ответе запишите только сумму.

Входные данные: 5, 15, 13, 18, 17, 19

Решение:
# Программа:
n = int(input())
total = 0
for i in range(n):
    x = int(input())
    if x % 5 == 3:
        total += x
print(total)

Проверка: 15%5=0, 13%5=3 ✓, 18%5=3 ✓, 17%5=2, 19%5=4
Ответ: 13 + 18 = 31

Пример 2: Окончание на 32 в 8-ричной системе

Условие: Напишите программу подсчёта суммы элементов последовательности натуральных чисел, запись которых в 8-ричной системе счисления оканчивается на 32. В ответе запишите только сумму.

Входные данные: 4, 90, 116, 26, 32

Решение:
n = int(input())
total = 0
for i in range(n):
    x = int(input())
    if x % (8*8) == 3*8 + 2:
        total += x
print(total)

3*8 + 2 = 26, поэтому условие: x % 64 == 26
Проверка: 90%64=26 ✓, 116%64=52, 26%64=26 ✓, 32%64=32
Ответ: 90 + 26 = 116

Пример 3: Предпоследняя цифра в 8-ричной системе равна 3

Условие: Напишите программу подсчёта суммы элементов последовательности натуральных чисел, предпоследняя цифра в записи которых в системе счисления с основанием 8 равна 3.

Входные данные: 4, 24, 32, 88, 112

Решение:
n = int(input())
total = 0
for i in range(n):
    x = int(input())
    if (x // 8) % 8 == 3:
        total += x
print(total)

Проверка: 24→24//8=3→3%8=3 ✓, 32→32//8=4→4%8=4,
88→88//8=11→11%8=3 ✓, 112→112//8=14→14%8=6
Ответ: 24 + 88 = 112

Пример 4: Ввод до сигнального 0 (окончание на 3 в 5-ричной)

Условие: Напишите программу подсчёта суммы элементов последовательности натуральных чисел, запись которых в 5-ричной системе счисления оканчивается на цифру 3. Количество чисел заранее не известно. Признак конца ввода — число 0.

Входные данные: 13, 18, 17, 15, 0

Решение:
total = 0
x = int(input())
while x != 0:
    if x % 5 == 3:
        total += x
    x = int(input())
print(total)

Проверка: 13%5=3 ✓, 18%5=3 ✓, 17%5=2, 15%5=0
0 — сигнал конца, не обрабатываем
Ответ: 13 + 18 = 31

📊 Вариант: найти среднее арифметическое

Помимо подсчёта суммы отобранных чисел или их количества, в задании 16 может потребоваться найти среднее арифметическое тех элементов последовательности, которые удовлетворяют заданному условию.

Для этого нужно накапливать одновременно две переменные:

total_sum = 0
count = 0

for i in range(n):
    x = int(input())
    if # условие отбора:
        total_sum += x
        count += 1

if count > 0:
    print(total_sum / count)
else:
    print(0)

Важно помнить, что если ни одно число не подошло под условие, то count == 0. Делить на ноль нельзя, поэтому сначала проверяем count > 0. В ответ при таком случае, вероятнее всего, нужно вывести 0.

💡 Связь со стандартными формулами

Среднее арифметическое отобранных чисел считается так же, как и всегда: сумма ÷ количество. Поэтому в коде достаточно завести две переменные-счётчика: одна для суммы, другая для количества подходящих чисел.

⚠️ Частые ошибки

🎯 Алгоритм решения

  1. 📝 Внимательно прочитайте условие: какой тип задачи?
  2. 🔢 Определите, какое условие проверять (окончание, цифра и т.д.)
  3. 💻 Напишите программу по шаблону с правильным условием
  4. 🧪 Проверьте программу на тестовых данных
  5. ✅ Запишите полученный ответ