ОГЭ
Информатика
21 июля 2026
19 минут чтения

Задание 16 ОГЭ по информатике: программа на универсальном языке программирования

Задание 16 — последнее задание ОГЭ по информатике и самое трудное во всей работе. Нужно написать программу, которая обрабатывает последовательность натуральных чисел: считает количество, сумму, максимум или среднее арифметическое элементов с заданным признаком. Уровень сложности — высокий, максимум — 2 первичных балла, примерное время выполнения — 25 минут. Задание входит в часть 2 и выполняется на компьютере, а ответом служит отдельный файл с исходным текстом программы — ничего в бланк переписывать не нужно. Раздел кодификатора — «Алгоритмы и программирование», проверяемый элемент содержания 3.2. В статье — критерии оценивания дословно, главный приём («последняя цифра записи числа в системе с основанием qq — это остаток nmodqn \bmod q»), рабочие шаблоны на Python, Паскале и С++, разбор трёх реальных заданий из открытого банка ФИПИ и разбор ошибок, из-за которых теряют оба балла. Тренироваться удобно на заданиях 16 ОГЭ по информатике онлайн.


Что проверяет задание 16 ОГЭ по информатике

В обобщённом плане варианта КИМ ОГЭ формулировка строки 16 звучит так: «Создавать и выполнять программы на универсальном языке программирования». Методические материалы ФИПИ для предметных комиссий уточняют: «Задание 16 проверяет умение записать алгоритм на языке программирования. Оно проверяет умения, связанные с созданием простейших программ, содержащих цикл и ветвление внутри цикла».

То есть от вас ждут ровно одну конструкцию: цикл, а внутри него ветвление с проверкой признака. Никакого «спортивного программирования», массивов, сортировок и функций здесь не требуется — и это хорошая новость: выучить нужно немного, но выучить надёжно.

Проверяемые умения:

  • организовать ввод данных в одном из двух форматов — «сначала количество, потом числа» или «читать до нуля»;
  • написать цикл с условием или цикл с переменной, не допустив зацикливания;
  • записать признак отбора в виде логического выражения, используя операции с целыми числами — целочисленное деление и остаток от деления;
  • правильно инициализировать накопитель (счётчик, сумму, максимум) и обновлять его внутри цикла;
  • обработать краевой случай «подходящих элементов нет» и вывести ответ ровно в том виде, который требует условие;
  • довести программу до состояния, когда она компилируется и запускается, и самостоятельно её протестировать.

Проекты документов ОГЭ-2027 на момент публикации ФИПИ ещё не издавал, поэтому все цифры и формулировки ниже приведены по действующим документам 2026 года (демоверсия, спецификация, кодификатор). В спецификации 2026 года записано, что изменений структуры и содержания КИМ по сравнению с 2025 годом нет, так что структура почти наверняка сохранится и в 2027-м, но перепроверить проекты после их публикации всё равно стоит.

ПараметрЗначение
Максимальный балл2 первичных (возможна и промежуточная оценка в 1 балл)
Уровень сложностиВысокий
Формат ответаРазвёрнутый — отдельный файл с исходным текстом программы (расширение определяется средой программирования)
Часть работыЧасть 2 (задания 11–16), выполняется на компьютере
Раздел кодификатора3. Алгоритмы и программирование, элемент содержания 3.2
Рекомендуемое время25 минут (по обобщённому плану варианта КИМ)
Кто проверяетЭксперты предметной комиссии: запускают программу на трёх тестах из критериев
Связанные задания6 (тот же элемент 3.2), 10 (системы счисления), 15 (Робот), 14 (обработка данных)

Задание 16 — обязательное. Это не «15.2 на выбор»

До 2024 года включительно в работе было 15 заданий, а последнее из них было альтернативным: ученик выбирал одно из двух — 15.1 (Робот) или 15.2 (программа). С 2025 года так больше не работает. Спецификация КИМ ОГЭ 2025 года формулирует это дословно:

«В КИМ 2025 г. заданию 15 соответствует задание 15.1 из КИМ 2024 г., а заданию 16 – задание 15.2 из КИМ 2024 г. Таким образом, количество заданий в работе увеличилось с 15 до 16, а задание 15 перестало быть альтернативным. Максимальный первичный балл за выполнение экзаменационной работы увеличен с 19 до 21 балла».

Сейчас в КИМ 16 заданий, задание 15 (Робот) и задание 16 (программа) — два разных обязательных задания, и делать нужно оба. Единственное задание с выбором подпункта — 13 (13.1 презентация или 13.2 текстовый документ). Если вы готовитесь по сборникам и сайтам, где это задание всё ещё называется «15.2», просто держите в голове: сама задача та же, но отказаться от неё в пользу Робота больше нельзя.

Самое трудное задание работы — и это подтверждается цифрами

Федеральной статистики по ОГЭ ФИПИ не публикует, но есть региональные методические анализы. По данным Красноярского края за ОГЭ-2025 (16 072 участника) распределение баллов за задание 16 такое: 0 баллов — 95,97 % участников, 1 балл — 0,62 %, 2 балла — 3,42 %. Средний процент выполнения задания — 3,72 % (это доля набранных баллов от максимально возможных, а не доля справившихся участников). Для сравнения: полные 2 балла за соседнее задание 15 (Робот) в том же регионе получили 22,95 % — примерно в шесть-семь раз больше.

Отчёт прямо отмечает: «Большинство участников не приступали к его выполнению, что свидетельствует о высоком уровне сложности, недостаточной подготовке по программированию и наличии значительного психологического барьера при работе с кодом». Вывод для вас практический: подавляющее большинство просто не пробует. Значит, отработанный до автоматизма шаблон из 8–10 строк даёт два балла там, где 96 % конкурентов получают ноль.

Тренируйтесь на реальных заданиях

Задания 16 ОГЭ по информатике из открытого банка ФИПИ. Разбирайте условия, пишите программу в своей среде и сверяйте результат — бесплатно.

Решать задание 16

Как выглядит формулировка

Условие задания 16 всегда собрано из четырёх блоков: что найтикак подаются данные что вывестипример работы (таблица «Входные данные / Выходные данные»). Вот реальные формулировки из открытого банка ФИПИ и из демоверсии:

  • «Напишите программу подсчёта суммы элементов последовательности натуральных чисел, запись которых в 7-ричной системе счисления оканчивается на цифру 1. В ответе запишите только сумму» (формулировка демоверсии ОГЭ-2026).
  • «Напишите программу, которая в последовательности натуральных десятичных чисел определяет количество элементов, запись которых в системе счисления с основанием 7 оканчивается цифрой 1. Если среди входных данных таких элементов нет, программа должна вывести «NO»».
  • «Напишите программу, которая в последовательности натуральных десятичных чисел определяет наибольший элемент, запись которого в системе счисления с основанием 7 оканчивается нечётной цифрой. Если среди входных данных таких элементов нет, программа должна вывести «NO»».
  • «Напишите программу, которая в последовательности натуральных десятичных чисел определяет среднее арифметическое элементов, запись которых в системе счисления с основанием 7 оканчивается нечётной цифрой».
  • «Напишите программу подсчёта количества элементов последовательности натуральных чисел, запись которых в восьмеричной системе счисления четырёхзначна и оканчивается на цифру 5. В ответе запишите количество искомых элементов».

Как видите, «скелет» одинаков, а меняются три вещи: накопитель (количество / сумма / максимум / среднее), признак отбора (оканчивается на конкретную цифру / на нечётную цифру / плюс условие на количество разрядов) и поведение при отсутствии подходящих элементов (вывести «NO» или ничего специально не делать).

Как сдаётся ответ

Ответ на задание 16 — не запись в бланке, а отдельный файл с исходным текстом программы. Инструкция демоверсии формулирует это так: «Результатом выполнения каждого из заданий 13–16 является отдельный файл. Формат файла, его имя и каталог для сохранения Вам сообщат организаторы экзамена». Для одного задания — один файл. Бланк ответов № 2 в ОГЭ по информатике не используется вообще: в бланк № 1 переносятся только краткие ответы на задания 1–12.

Жёстко заданного расширения у задания 16 нет. Методические материалы ФИПИ говорят: «Расширение файла будет соответствовать использованной среде программирования», то есть это .py, .pas, .cpp и так далее. Если расширение или имя файла окажутся не теми, что просили организаторы, но эксперт сумеет открыть файл, оценка за это не снижается. А вот если открыть и прочитать содержимое не удалось — 0 баллов.

Теория: всё, что нужно для задания 16

Критерии: за что дают 2, 1 и 0 баллов

Оценивается не текст программы, а её поведение. Эксперт берёт ваш файл, компилирует его (если язык компилируемый), запускает и прогоняет на трёх тестах, которые напечатаны в критериях и которых вы на экзамене не видите. Пример из условия — это, как правило, ещё один, «нулевой» ориентир, но именно на нём ошибку поймать удаётся далеко не всегда.

БаллФормулировка ФИПИ
2«Предложено верное решение. Программа правильно работает на всех приведённых выше тестах»
1«Программа выдаёт неверный ответ только на одном из тестов, приведённых выше»
0«Программа выдаёт на тестах неверные ответы, количество которых отличается от указанного в критерии на 1 балл» — то есть ошибка более чем на одном тесте

Обратите внимание: полутонов почти нет. Один непройденный тест из трёх — это 1 балл, два — уже 0. Цена одного непродуманного краевого случая — весь балл за задание.

Три ситуации, в которых ставят 0 независимо от качества алгоритма:

  • Программа не компилируется и не запускается. Дословно из методических материалов ФИПИ: «Если программа содержит синтаксические ошибки, и потому её компиляция и запуск невозможны, то задание оценивается в 0 баллов» — потому что задание выполняется за компьютером и у вас есть возможность скомпилировать, запустить и отладить программу. Это главное отличие от задания 15 (Робот), где «допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения». В задании 16 такой поблажки нет.
  • Нет ввода данных или нет вывода ответа. Дословно: «Программа, которая не содержит ввода данных (например, данные для работы программы задаются константами в её исходном коде) или не содержит вывода ответа, также оценивается в 0 баллов». Самый обидный сценарий — во время отладки заменили ввод на список констант, а вернуть забыли.
  • Программа зацикливается или аварийно завершается. «Если программа выдаёт неправильный ответ, или не завершает свою работу из-за зацикливания, или аварийно завершает свою работу из-за алгоритмической ошибки (например, деления на ноль), то данный тест не засчитывается». Деление на ноль — реальный риск в задачах на среднее арифметическое.

Зато язык — любой. «Решением является программа, записанная на любом языке программирования»; эксперту предписано сначала «установить язык программирования, на котором записана программа — как правило, это тот язык программирования, который изучался школьниками». Кодификатор перечисляет Python, C++, Паскаль, Java, C# и Школьный алгоритмический язык. Ввод-вывод тоже не обязан быть консольным: ФИПИ прямо допускает файловый ввод-вывод и графический интерфейс.

Главный приём: последняя цифра в системе с основанием q

Формулировка «запись числа в системе счисления с основанием 7 оканчивается цифрой 1» звучит устрашающе и толкает на мысль «надо перевести число в семеричную систему». Переводить не нужно ни разу. Работает тождество:

последняя цифра записи n в системе с основанием q  =  nmodq\text{последняя цифра записи } n \text{ в системе с основанием } q \;=\; n \bmod q

Почему так. В позиционной системе с основанием qq число записывается как

n=akqk+ak1qk1++a1q+a0,0a0<q.n = a_k q^{k} + a_{k-1} q^{k-1} + \dots + a_1 q + a_0,\qquad 0 \le a_0 < q.

Все слагаемые, кроме a0a_0, делятся на qq нацело, а сама последняя цифра a0a_0 меньше qq. Значит a0a_0 — это в точности остаток от деления nn на qq. Проверим на реальных числах из задания банка ФИПИ:

ЧислоЗапись в 7-ричной системеПоследняя цифраОстаток nmod7n \bmod 7
1215715_755
1521721_711
1013713_733
711317131_711
501017101_711
1114714_744

Совпадает всегда. Поэтому «оканчивается цифрой dd в системе с основанием qq» — это ровно одна проверка:

x % q == d      # Python и C++
x mod q = d     # Паскаль

Это не «приблизительный трюк», а именно тождество, и его использует сама ФИПИ. В критериях демоверсии ОГЭ-2026 эталонная программа для задачи «сумма элементов, запись которых в 7-ричной системе оканчивается на цифру 1» выглядит так:

Python — эталонное решение из критериев демоверсии ОГЭ-2026

n = int(input())
s = 0
for i in range(n):
    x = int(input())
    if x % 7 == 1:
        s += x
print(s)

Никаких переводов систем счисления — одна строка с процентом. Обратите внимание и на другое: в критериях сразу написано «Возможны и другие варианты решения». Ваш код не обязан совпадать с эталонным; он обязан выдавать правильные ответы.

Ловушка № 1: «оканчивается нечётной цифрой»

Это самая дорогая ошибка в задании 16. Формулировка «оканчивается нечётной цифрой» встречается в банке постоянно, и почти все пишут:

if x % 2 == 1:   # НЕВЕРНО: это чётность самого числа, а не его цифры

Правильно — взять сначала последнюю цифру qq-ичной записи, а уже её проверить на чётность:

if (x % q) % 2 == 1:   # ВЕРНО: сначала цифра, потом её чётность

Почему это не одно и то же. Запишем n=qm+a0n = q\cdot m + a_0. Если qq чётное (например q=10q = 10, 88, 1616), то qmq\cdot m чётно, и чётность nn совпадает с чётностью a0a_0 — обе формулы дают одно и то же. Но если qq нечётное — а в заданиях банка это как раз q=7q = 7 и q=5q = 5qmq\cdot m может быть и чётным, и нечётным, и формулы расходятся.

Простейший контрпример: x=8x = 8, q=7q = 7. Запись 810=1178_{10} = 11_7, последняя цифра 1 — нечётная, элемент подходит. А само число 8 чётное, и неверная проверка его отбросит.

Насколько это дорого, видно на реальных данных банка. Возьмём последовательность 12, 15, 10, 71, 50, 11 — она встречается в примерах сразу нескольких заданий:

ОснованиеВерно: (x % q) % 2 == 1Неверно: x % 2 == 1
q=7q = 712, 15, 10, 71, 50 — 5 элементов, максимум 7115, 71, 11 — 3 элемента, максимум тоже 71
q=5q = 571, 11 — 2 элемента (это и есть ответ задания)15, 71, 11 — 3 элемента — неверный ответ

И здесь скрыто главное коварство: в задании на максимум обе версии на этом примере дают 71, то есть пример из условия ошибку не ловит. Вы запускаете программу, видите «71 — совпало» и сдаёте файл, а эксперт прогоняет свои три теста, и два из них падают. Запомните правило: пример из условия — не доказательство правильности, а только первая проверка.

Два формата ввода и рабочие шаблоны

В заданиях банка и демоверсии встречаются ровно два способа подачи данных. Определить, какой перед вами, нужно до того, как вы напишете первую строку кода.

Формат A. «Сначала N, потом N чисел»

«На вход программе сначала подаётся количество элементов последовательности N (1 ≤ N ≤ 1000), затем каждый элемент последовательности в отдельной строке» — или «Программа получает на вход в первой строке натуральное число – количество чисел N (3 ≤ N ≤ 10000), затем N натуральных чисел, не превышающих 30 000, каждое в отдельной строке».

Количество известно заранее, поэтому годится обычный цикл с переменной. Это формат демоверсии ОГЭ-2026, и именно его стоит считать «основным».

Python

n = int(input())
k = 0
for i in range(n):
    x = int(input())
    if x % 7 == 1:
        k += 1
print(k)

Паскаль

var n, i, x, k: integer;
begin
  readln(n);
  k := 0;
  for i := 1 to n do
  begin
    readln(x);
    if x mod 7 = 1 then
      k := k + 1;
  end;
  writeln(k)
end.

С++

#include <iostream>
using namespace std;

int main() {
    int n, x, k = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x;
        if (x % 7 == 1) k++;
    }
    cout << k << endl;
    return 0;
}

Формат B. «Читаем до нуля»

«Программа получает на вход натуральные числа. Количество введённых чисел неизвестно, но не превышает 1000. Последовательность чисел заканчивается числом 0 (0 – признак окончания ввода, не входит в последовательность)».

Три следствия из этой формулировки:

  • количество заранее неизвестно, значит нужен цикл с условием, а не цикл со счётчиком;
  • ноль — не элемент последовательности, его нельзя учитывать в счётчике, сумме или максимуме;
  • чтение обязано стоять дважды: один раз до цикла и один раз в конце тела цикла. Забыли второе — программа зациклится.

Python

k = 0
x = int(input())
while x != 0:
    if x % 7 == 1:
        k += 1
    x = int(input())   # без этой строки — вечный цикл
print(k)               # вывод ПОСЛЕ цикла, не внутри

Паскаль

var x, k: integer;
begin
  k := 0;
  readln(x);
  while x <> 0 do
  begin
    if x mod 7 = 1 then
      k := k + 1;
    readln(x)
  end;
  writeln(k)
end.

С++

#include <iostream>
using namespace std;

int main() {
    int x, k = 0;
    cin >> x;
    while (x != 0) {
        if (x % 7 == 1) k++;
        cin >> x;
    }
    cout << k << endl;
    return 0;
}

Есть и второй, эквивалентный способ записи формата B — «бесконечный цикл с досрочным выходом». В нём чтение стоит в одном месте, поэтому рассинхронизировать его сложнее:

k = 0
while True:
    x = int(input())
    if x == 0:
        break
    if x % 7 == 1:
        k += 1
print(k)

Целочисленные операции: шпаргалка по трём языкам

ОперацияPythonПаскальС++
Остаток от деления%mod%
Целочисленное деление//div/ (для целых)
Проверка равенства=====
Логическое «и»andand&&

Две ловушки языка. В С++ знак / для целых переменных — это уже целочисленное деление, а // означает комментарий, и строка просто «исчезнет». В Python, наоборот, / всегда даёт вещественное число, поэтому для целочисленного деления обязателен //. В Паскале в составных условиях скобки вокруг сравнений обязательны: (x mod 8 = 5) and (x >= 512).

Накопители: инициализация, обновление, пустой случай

Накопитель — переменная, в которой копится ответ. Их всего четыре разновидности, и у каждой своя правильная инициализация.

Что ищемДо циклаВ циклеЕсли ничего не нашли
Количествоk = 0k += 1естественно получится 0 — часто это и есть верный ответ
Суммаs = 0s += xестественно получится 0
Максимумm = 0если x больше m, то m = xнужна явная ветка: m осталось равным 0
Среднее арифметическоеs = 0 и k = 0s += x и k += 1ветка обязательна: иначе деление на ноль и аварийный выход

Почему для максимума годится ноль

В общем случае инициализировать максимум нулём нельзя — если среди элементов бывают отрицательные, ответ ошибочно останется нулевым. Но в задании 16 ОГЭ элементы последовательности всегда натуральные (условие банка говорит: «натуральных десятичных чисел, не превышающих 30 000»), то есть x1>0x \ge 1 > 0. Поэтому m=0m = 0 корректен, и одновременно эта же переменная работает флагом: если после цикла m=0m = 0, значит подходящих элементов не было. Одна переменная решает две задачи.

Чем инициализировать максимум нельзя

  • Первым введённым элементом — он может не обладать признаком, и тогда он попадёт в ответ незаслуженно.
  • Единицей или другой «маленькой, но не нулевой» константой — тогда переменная перестаёт работать флагом: если подходящих элементов нет, программа напечатает 1 вместо «NO».
  • Верхней границей 30 000 — это инициализация для поиска минимума, максимум так не ищут.

Универсальная альтернатива — отдельный флаг: переменная found, которая становится истинной при первом подходящем элементе. Чуть длиннее, зато переносится на любые задачи, не только с натуральными числами.

«0» или «NO» — решает текст условия

  • Если в условии есть фраза «Если среди входных данных таких элементов нет, программа должна вывести «NO»» — ветка обязательна, и печатать надо именно эти две латинские буквы.
  • Если такой фразы нет (как в демоверсии ОГЭ-2026), счётчик или сумма естественно дадут 0, и это правильный ответ. Первый же тест из критериев демоверсии — вход «1 / 7», ожидаемый вывод «0» — проверяет ровно этот случай.
  • Для максимума и среднего ветка нужна всегда: у максимума нет «естественного нуля», а среднее без неё даст деление на ноль.

Python — максимум с признаком и веткой «NO» (формат «до нуля»)

m = 0                  # элементы натуральные, поэтому 0 безопасен
x = int(input())
while x != 0:
    if (x % 7) % 2 == 1 and x > m:
        m = x
    x = int(input())
if m > 0:
    print(m)
else:
    print("NO")

Python — среднее арифметическое (формат «сначала N»)

n = int(input())
s = 0
k = 0
for i in range(n):
    x = int(input())
    if (x % 7) % 2 == 1:
        s += x
        k += 1
if k > 0:
    print(s / k)       # ответ вещественный
else:
    print("NO")        # без этой ветки — деление на ноль

Про переполнение можно не думать: элементы не превышают 30 000, а их не больше 10 000, так что даже сумма не выйдет за 31083 \cdot 10^{8}, что заведомо укладывается в обычный целый тип во всех трёх языках.

Ловушка № 2: «k-значна в системе с основанием q»

Часть заданий добавляет к признаку второе условие: запись числа должна быть, например, «четырёхзначной в восьмеричной системе». Формально это неравенство:

qk1    n    qk1q^{\,k-1} \;\le\; n \;\le\; q^{\,k} - 1

Смысл прозрачен: самое маленькое kk-значное число в системе с основанием qq — это единица с k1k-1 нулями, то есть qk1q^{\,k-1}; самое большое — все цифры максимальны, то есть на единицу меньше qkq^{\,k}. Границы для всех случаев, которые встречаются в банке:

Формулировка условияНеравенствоДиапазон
трёхзначна в шестнадцатеричной162n163116^2 \le n \le 16^3 - 1от 256 до 4095
четырёхзначна в восьмеричной83n8418^3 \le n \le 8^4 - 1от 512 до 4095
четырёхзначна в системе с основанием 553n5415^3 \le n \le 5^4 - 1от 125 до 624

Считать количество разрядов через длину десятичной записи нельзя. Конструкция вида len(str(x)) == 4 проверяет, что у числа четыре десятичные цифры, а нужна длина записи в системе qq. Например, 557 в десятичной трёхзначно, а в восьмеричной это 105581055_8 — четыре разряда.

Если сравнивать с границами не хочется (или основание задано переменной), количество разрядов можно честно посчитать циклом — это тот самый «разбор числа на цифры» из кодификатора:

d = 0          # d — количество цифр числа x в системе с основанием q
t = x
while t > 0:
    t = t // q   # отбрасываем последнюю цифру
    d += 1

Тем же приёмом считают сумму цифр числа в системе с основанием qq — сюжет из того же элемента кодификатора:

s = 0
t = x
while t > 0:
    s += t % q   # отрезали последнюю цифру и прибавили её
    t = t // q   # выбросили её из числа

При q=10q = 10 это привычная сумма десятичных цифр — та же самая конструкция, просто с другим основанием.

Алгоритм решения задания 16

  1. Разберите условие на четыре части и выпишите на черновик: формат ввода («сначала N» или «до нуля»), накопитель (счётчик / сумма / максимум / сумма плюс счётчик), признак отбора и то, что печатать, если подходящих элементов не нашлось — 0 или «NO».
  2. Переведите признак в одну формулу. «Оканчивается цифрой dd в системе qq» → x % q == d; «оканчивается нечётной цифрой» → (x % q) % 2 == 1; «k-значна в системе qq» → qk1xqk1q^{\,k-1} \le x \le q^{\,k}-1. Проверьте формулу устно на двух-трёх числах из примера в условии.
  3. Напишите пустой, но синтаксически верный каркас цикла и сразу запустите его. Пусть он пока ничего не считает. Так вы поймаете опечатки в объявлениях и в структуре программы до того, как код разрастётся, — а именно они превращают задание в ноль баллов.
  4. Вставьте накопитель и ветвление. Инициализация — до цикла, обновление — внутри, вывод — после цикла. Проверьте по глазам: у формата «до нуля» операций чтения должно быть две.
  5. Добавьте ветку «ничего не нашли», если условие требует «NO», или если вы ищете максимум либо среднее.
  6. Протестируйте на пяти сценариях, а не только на примере из условия (таблица ниже). Тестирование — обязательная часть работы, а не «если останется время»: у эксперта три теста, которых вы не видите.
  7. Сохраните файл в указанный организаторами каталог под указанным именем и убедитесь, что сохранён именно последний, рабочий вариант программы, а не промежуточный черновик.
Свой тестЧто проверяет
Пример из условиябазовую работоспособность; ответ обязан совпасть с таблицей
Ни одного подходящего элементасамый частый источник потери балла: должно быть 0 или «NO» по условию
Все элементы подходятчто ничего не теряется: ответ равен длине или сумме всей последовательности
Ровно один подходящий элементинициализацию накопителя, особенно у максимума
Подходящий элемент — последний перед нулёмчто цикл не «съел» последний элемент и не учёл сам ноль
Чётное число с нечётной цифрой в записи (например, 8 при q=7q = 7)подмену (x % q) % 2 на x % 2

Два балла там, где большинство берёт ноль

Напишите шаблон 10–15 раз подряд по реальным условиям банка ФИПИ — и на экзамене он ляжет на бумагу за пять минут вместо двадцати пяти.

Открыть тренажёр

Примеры с разбором

Ниже — три реальных задания из открытого банка ФИПИ. Эталонного ответа у заданий с развёрнутым ответом не бывает: критерии прямо говорят «Возможны и другие варианты решения». Поэтому приведённые программы — пример возможного решения, а не единственно верный текст. Все они проверены запуском на данных из условия и на дополнительных краевых тестах.

Пример 1. Количество элементов с нечётной последней цифрой в 5-ричной записи

Условие (реальное задание из открытого банка ФИПИ):

Напишите программу, которая в последовательности натуральных десятичных чисел определяет количество элементов, запись которых в системе счисления с основанием 5 оканчивается нечётной цифрой. Если среди входных данных таких элементов нет, программа должна вывести «NO».
Программа получает на вход в первой строке натуральное число — количество чисел N (3 ≤ N ≤ 10000), затем N натуральных чисел, не превышающих 30 000, каждое в отдельной строке.
Программа должна вывести одно число — количество десятичных чисел (элементов последовательности), запись которых в 5-ричной системе счисления оканчивается нечётной цифрой, или «NO», если среди входных данных таких элементов нет.

Пример работы программы:

Входные данныеВыходные данные
6
12
15
10
71
50
11
2

Разбор:

  • Формат ввода — «сначала N, потом N чисел», значит подойдёт цикл с переменной.
  • Накопитель — счётчик, начальное значение 0.
  • Признак. Последняя цифра 5-ричной записи — это x % 5. Нужна её нечётность, поэтому условие — (x % 5) % 2 == 1.
  • Пустой случай. Условие требует «NO», значит ветка обязательна.

Проверим признак руками на данных примера:

ЧислоЗапись в 5-ричнойxmod5x \bmod 5Подходит?
1222522_52нет, чётная
1530530_50нет, чётная
1020520_50нет, чётная
712415241_51да
502005200_50нет, чётная
1121521_51да

Подходят 71 и 11 — ответ 2, совпадает с таблицей из условия.

Python

n = int(input())
k = 0
for i in range(n):
    x = int(input())
    if (x % 5) % 2 == 1:
        k += 1
if k > 0:
    print(k)
else:
    print("NO")

Паскаль

var n, i, x, k: integer;
begin
  readln(n);
  k := 0;
  for i := 1 to n do
  begin
    readln(x);
    if (x mod 5) mod 2 = 1 then
      k := k + 1;
  end;
  if k > 0 then
    writeln(k)
  else
    writeln('NO')
end.

С++

#include <iostream>
using namespace std;

int main() {
    int n, x, k = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x;
        if ((x % 5) % 2 == 1) k++;
    }
    if (k > 0) cout << k << endl;
    else cout << "NO" << endl;
    return 0;
}

Почему это решение проходит критерии. Программа содержит все три обязательные части: ввод данных, вычисление и вывод ответа. Она компилируется и запускается; цикл заведомо конечен (ровно N повторений), деления на ноль нет. Признак записан через последнюю цифру 5-ричной записи, а не через чётность самого числа, поэтому корректен для любых входных данных, а не только для примера. Ветка «NO» покрывает случай, когда подходящих элементов нет. Значит, программа выдаёт верный ответ на всех тестах — это 2 балла.

Проверка здравым смыслом и «антипроверка». В 5-ричной системе цифры бывают только 0, 1, 2, 3, 4; нечётные среди них — 1 и 3, то есть подходят числа, дающие при делении на 5 остаток 1 или 3. Из шести чисел примера таких два — правдоподобно. А вот если бы мы написали привычное x % 2 == 1, подошли бы 15, 71 и 11, и программа напечатала бы 3 вместо 2 — балл потерян уже на примере из условия.

Пример 2. Четырёхзначные в восьмеричной, оканчивающиеся на 5 (ввод до нуля)

Условие (реальное задание из открытого банка ФИПИ):

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

Пример работы программы:

Входные данныеВыходные данные
485
557
893
3029
4125
0
3

Разбор:

  • Формат ввода — «до нуля»: количество неизвестно, нужен цикл с условием и два чтения.
  • Накопитель — счётчик.
  • Признак составной: «четырёхзначна в восьмеричной» — это 83x8418^3 \le x \le 8^4 - 1, то есть 512x4095512 \le x \le 4095; «оканчивается на цифру 5» — это x % 8 == 5. Оба условия соединяются через «и».
  • Пустой случай. Требования выводить «NO» нет, поэтому счётчик сам напечатает 0 — и это правильный ответ.

Проверим каждое число примера:

ЧислоЗапись в восьмеричнойРазрядовПоследняя цифраПодходит?
4857458745_835нет: 485 меньше 512
557105581055_845да
893157581575_845да
3029572585725_845да
412510035810035_855нет: 4125 больше 4095

Подходят 557, 893 и 3029 — ответ 3, совпадает с таблицей из условия. Обратите внимание на 485 и 4125: у обоих последняя восьмеричная цифра равна 5, и отсекает их именно условие на количество разрядов. Без него программа напечатала бы 5.

Python

k = 0
x = int(input())
while x != 0:
    if 512 <= x <= 4095 and x % 8 == 5:
        k += 1
    x = int(input())
print(k)

Паскаль

var x, k: integer;
begin
  k := 0;
  readln(x);
  while x <> 0 do
  begin
    if (x >= 512) and (x <= 4095) and (x mod 8 = 5) then
      k := k + 1;
    readln(x)
  end;
  writeln(k)
end.

С++

#include <iostream>
using namespace std;

int main() {
    int x, k = 0;
    cin >> x;
    while (x != 0) {
        if (x >= 512 && x <= 4095 && x % 8 == 5) k++;
        cin >> x;
    }
    cout << k << endl;
    return 0;
}

Если не хочется запоминать границы, то же самое можно записать через явный подсчёт разрядов — вариант ровно так же засчитывается:

k = 0
x = int(input())
while x != 0:
    d = 0
    t = x
    while t > 0:
        t = t // 8
        d += 1
    if d == 4 and x % 8 == 5:
        k += 1
    x = int(input())
print(k)

Почему это решение проходит критерии. Ноль обрабатывается как признак конца ввода и не попадает в проверку: условие цикла отсекает его раньше, чем начнётся ветвление. Программа завершается на любых допустимых данных, потому что завершающий ноль гарантирован условием, а внутри цикла есть повторное чтение. Ввод, вычисление и вывод присутствуют, вывод — в единственном экземпляре и после цикла. Ответ верен на любых данных, а не только на примере, — значит, все тесты пройдены, 2 балла.

Проверка здравым смыслом. Четырёхзначные восьмеричные числа — это диапазон от 512 до 4095, то есть примерно от 0,5 до 4 тысяч. Из пяти чисел примера в этот диапазон попадают три, и у всех трёх остаток от деления на 8 равен 5 — ответ 3 выглядит правдоподобно.

Пример 3. Наибольший элемент с нечётной последней цифрой в 7-ричной записи

Условие (реальное задание из открытого банка ФИПИ):

Напишите программу, которая в последовательности натуральных десятичных чисел определяет наибольший элемент, запись которого в системе счисления с основанием 7 оканчивается нечётной цифрой. Если среди входных данных таких элементов нет, программа должна вывести «NO».
Программа получает на вход натуральные десятичные числа, не превышающие 30 000, каждое в отдельной строке. Количество введённых чисел неизвестно, их последовательность заканчивается числом 0 (0 — признак окончания ввода, в последовательность не входит).
Программа должна вывести одно десятичное число — наибольший элемент последовательности, запись которого в 7-ричной системе счисления оканчивается нечётной цифрой, или «NO», если среди входных данных таких элементов нет.

Пример работы программы:

Входные данныеВыходные данные
12
15
10
71
50
11
0
71

Разбор:

  • Формат ввода — «до нуля».
  • Накопитель — максимум. Инициализируем нулём: элементы натуральные, поэтому 0 меньше любого из них, и та же переменная служит признаком «ничего не нашли».
  • Признак (x % 7) % 2 == 1.
  • Пустой случай — печатаем «NO».

Разберём пример: остатки от деления на 7 у чисел 12, 15, 10, 71, 50 равны 5, 1, 3, 1, 1 — все нечётные, поэтому подходят все пять элементов; у числа 11 остаток 4, оно не подходит. Наибольший из подходящих — 71, что совпадает с таблицей из условия.

Python

m = 0
x = int(input())
while x != 0:
    if (x % 7) % 2 == 1 and x > m:
        m = x
    x = int(input())
if m > 0:
    print(m)
else:
    print("NO")

Паскаль

var x, m: integer;
begin
  m := 0;
  readln(x);
  while x <> 0 do
  begin
    if ((x mod 7) mod 2 = 1) and (x > m) then
      m := x;
    readln(x)
  end;
  if m > 0 then
    writeln(m)
  else
    writeln('NO')
end.

С++

#include <iostream>
using namespace std;

int main() {
    int x, m = 0;
    cin >> x;
    while (x != 0) {
        if ((x % 7) % 2 == 1 && x > m) m = x;
        cin >> x;
    }
    if (m > 0) cout << m << endl;
    else cout << "NO" << endl;
    return 0;
}

Почему это решение проходит критерии. Все три обязательные части на месте, цикл завершается, деления на ноль нет. Инициализация нулём корректна, потому что элементы — натуральные числа: любой подходящий элемент строго больше нуля и обязательно перезапишет максимум. Ветка «NO» срабатывает ровно тогда, когда ни один элемент не подошёл. Программа даёт верный ответ на любых допустимых данных — 2 балла.

Проверка на тесте, которого нет в условии — и это важно. Здесь неверная проверка x % 2 == 1 на примере из условия дала бы тот же ответ 71 — пример ошибку не ловит. Поймает её другой вход, например «8, 0»: правильная программа напечатает 8 (запись 810=1178_{10} = 11_7, последняя цифра 1 — нечётная), а неправильная — «NO». Проверьте ещё два краевых случая: вход «1, 0» должен дать 1 (наименьший возможный элемент не должен потеряться), а вход «11, 18, 0» — «NO» (у обоих чисел остаток от деления на 7 равен 4; этот тест заодно ловит инициализацию максимума единицей).

Типичные ошибки и ловушки

Список ниже собран из регионального методического анализа результатов ОГЭ-2025 и из разбора реальных условий банка. Региональный отчёт формулирует общую картину так: «неверно сформулированное условие отбора чисел (например, ошибка в логике проверки делимости или чётности); игнорирование части условий задачи; ошибки в организации ввода-вывода данных; неточная реализация алгоритма, включая неверную инициализацию переменных, ошибки в циклах или условиях».

Завершающий ноль обработан как элемент последовательности

В формате «до нуля» проверка признака оказывается раньше проверки на ноль, и сам ноль попадает в счётчик, сумму или в сравнение для максимума. Условие оговаривает прямо: «0 — признак окончания ввода, не входит в последовательность». Особенно опасно в задачах «оканчивается на цифру 0» и «кратно 5»: там ноль формально подходит под признак и молча портит ответ.

Проверка x % 2 вместо (x % q) % 2

Чётность самого числа и чётность его последней цифры в системе с основанием qq совпадают только при чётном qq. В заданиях банка основания как раз нечётные — 7 и 5, — и формулы расходятся. На реальном примере при q=5q = 5 неверная версия даёт 3 вместо 2.

Остаток по 10 вместо остатка по основанию, и разряды по длине десятичной записи

Привычка «последняя цифра — это остаток от деления на 10» механически переносится на задание, где система счисления почти никогда не десятичная: нужно x % q. Точно так же «четырёхзначное в восьмеричной» — это 512x4095512 \le x \le 4095, а не «четыре знака на экране»: конструкция len(str(x)) == 4 считает десятичные разряды.

Неверная инициализация максимума

Максимум приравнивают к первому введённому элементу (а он может не обладать признаком), к единице (при отсутствии подходящих элементов программа напечатает 1 вместо «NO») или к верхней границе 30 000 (это инициализация для поиска минимума). Для натуральных элементов правильно и удобно m=0m = 0.

Не обработан случай «подходящих элементов нет»

Условие требует «NO», а программа печатает 0; или ищется среднее арифметическое, и без ветки происходит деление на ноль — программа аварийно завершается, и тест не засчитывается. Это самый частый способ потерять один-два теста из трёх при правильном в остальном алгоритме.

Зацикливание и вывод внутри цикла

В шаблоне «читаем до нуля» забыто второе чтение в конце тела цикла: переменная не меняется, условие остаётся истинным вечно — по правилам ФИПИ тест не засчитывается. Зеркальная ошибка — оператор вывода внутри цикла: программа печатает промежуточные значения на каждой итерации, а условие требует напечатать «только одно число».

Нет ввода или вывода, либо программа не компилируется

Данные «зашиты» константами в исходнике (частое последствие отладки) или ответ посчитан, но не напечатан — 0 баллов даже при безупречном алгоритме. То же самое с синтаксической ошибкой: программа, которую нельзя скомпилировать и запустить, оценивается в 0. В отличие от задания 15 (Робот), послаблений на «мелкие описки» здесь не предусмотрено — поэтому запускать программу нужно ещё в процессе написания, а не в последнюю минуту.

Как задание 16 связано с остальным экзаменом

Задание 16 замыкает раздел кодификатора «Алгоритмы и программирование», к которому относятся ещё три позиции — 5, 6 и 15. Вместе эти четыре задания дают 6 баллов из 21 — по спецификации это один из двух самых «дорогих» разделов работы. Вот что стоит отработать рядом:

  • Задание 6 — обратная задача к вашей: там дана чужая программа, и нужно формально её исполнить. Элемент кодификатора тот же самый — 3.2. Умение читать чужой код прямо помогает писать свой.
  • Задание 10 — системы счисления. Прямая опора для задания 16: именно там осваивается позиционная запись и понимание, почему последняя цифра равна остатку по основанию.
  • Задание 15 — алгоритм для исполнителя «Робот». Соседняя позиция того же высокого уровня, тоже 2 балла и тоже 25 минут; до 2025 года эти два задания были альтернативой друг другу. Требования к синтаксису там заметно мягче — учитывайте это при планировании времени.
  • Задание 5 — анализ алгоритма для исполнителя с фиксированным набором команд: тот же навык прослеживать состояние переменных по шагам.
  • Задание 14 — тот же класс задач «посчитать количество или сумму по условию», но средствами электронной таблицы. Полезный контраст: одна и та же логика отбора, два разных инструмента.

План подготовки на 3 недели

Неделя 1 — шаблон до автоматизма

Выберите язык, на котором учились в школе, и научитесь писать оба шаблона (формат «сначала N» и формат «до нуля») по памяти, без подглядываний, за две-три минуты. Пишите их в той самой среде, что будет на экзамене, и каждый раз запускайте: цель недели — чтобы пальцы сами набирали каркас, а голова оставалась свободной для условия. Параллельно закройте базу: остаток и целочисленное деление, приоритет операций, составные условия с «и».

Неделя 2 — признаки и накопители

Отработайте четыре накопителя (количество, сумма, максимум, среднее) и три вида признака: «оканчивается заданной цифрой», «оканчивается нечётной цифрой», «k-значна в системе qq плюс оканчивается цифрой». Каждый день — 3–4 задания, обязательно вслух проговаривая формулу признака до написания кода. Отдельный день посвятите краевым случаям: «нет подходящих элементов», «ровно один подходящий», «подходящий последний перед нулём».

Неделя 3 — на время и с самопроверкой

Решайте задания вперемешку, укладываясь в 25 минут вместе с тестированием. Каждое решение прогоняйте не только на примере из условия, но и на пяти своих тестах из таблицы выше — привыкайте, что без этого работа не закончена. В последние дни отработайте «предполётную проверку»: программа компилируется, ввод настоящий, а не константы, вывод один и после цикла, файл сохранён под нужным именем в нужном каталоге.

Проверьте себя на реальных заданиях

На Repet.ai собраны задания ОГЭ по информатике из открытого банка ФИПИ. Разбирайте условия, пишите программы и сверяйте ответы — бесплатно.

Перейти к практике
Частые вопросы

Часто задаваемые вопросы

Задание 16 проверяет умение создавать и выполнять программы на универсальном языке программирования (элемент кодификатора 3.2). Нужно написать программу, которая обрабатывает последовательность натуральных чисел: считает количество, сумму, максимум или среднее арифметическое элементов с заданным признаком. По методическим материалам ФИПИ проверяются умения, связанные с созданием простейших программ, содержащих цикл и ветвление внутри цикла.

Максимум — 2 первичных балла. 2 балла ставят, если программа правильно работает на всех тестах из критериев; 1 балл — если она выдаёт неверный ответ только на одном из тестов; 0 баллов — во всех остальных случаях. Тестов три, экзаменуемый их не видит. Программа, которая не компилируется, не содержит ввода данных или вывода ответа, оценивается в 0 баллов независимо от качества алгоритма.

Нет, делать нужно обязательно. До 2024 года включительно в работе было 15 заданий, и последнее было альтернативным: 15.1 (Робот) или 15.2 (программа) на выбор. С 2025 года заданий стало 16, бывшее 15.1 стало заданием 15, бывшее 15.2 — заданием 16, и выбирать между ними больше нельзя: выполнять нужно оба. Единственное задание с выбором подпункта — 13 (13.1 презентация или 13.2 текстовый документ). Максимальный первичный балл за работу при этом вырос с 19 до 21.

На любом. Критерии ФИПИ говорят прямо: «Решением является программа, записанная на любом языке программирования». Эксперт сначала определяет язык — как правило, это тот, который изучался в школе. Кодификатор перечисляет Python, C++, Паскаль, Java, C# и Школьный алгоритмический язык. Ввод-вывод тоже не обязан быть консольным: допускаются файловый ввод-вывод и графический интерфейс.

Последняя цифра записи натурального числа n в системе счисления с основанием q равна остатку от деления n на q. Поэтому «оканчивается цифрой d» — это проверка n % q == d, и переводить число в другую систему счисления не нужно. Важное исключение: «оканчивается нечётной цифрой» записывается как (n % q) % 2 == 1, а не как n % 2 == 1 — эти условия совпадают только при чётном q, а в заданиях банка основания обычно 5 и 7.

Это определяется текстом конкретного условия. Если сказано «Если среди входных данных таких элементов нет, программа должна вывести «NO»» — нужна отдельная ветка, печатающая NO. Если такого требования нет, счётчик или сумма естественно дадут 0, и это верный ответ: первый тест из критериев демоверсии ОГЭ-2026 проверяет именно вывод нуля. Для задач на максимум и на среднее арифметическое ветка нужна всегда: у максимума нет естественного нулевого значения, а среднее без неё приведёт к делению на ноль.

Отдельным файлом с исходным текстом программы — в бланк ничего переписывать не нужно. Инструкция демоверсии формулирует так: «Результатом выполнения каждого из заданий 13–16 является отдельный файл. Формат файла, его имя и каталог для сохранения Вам сообщат организаторы экзамена». Жёстко заданного расширения нет: оно соответствует использованной среде программирования (.py, .pas, .cpp и т. д.). Если расширение или имя не совпали с указанными, но эксперт сумел открыть файл, оценка не снижается.

Нет, будет 0 баллов. Методические материалы ФИПИ формулируют это прямо: если программа содержит синтаксические ошибки и потому её компиляция и запуск невозможны, задание оценивается в 0 баллов — ведь задание выполняется за компьютером, и у участника есть возможность скомпилировать, запустить и отладить программу. Это ключевое отличие от задания 15 (Робот), где допускаются отдельные синтаксические ошибки, не искажающие замысла автора решения.


Готовы взять два балла, которые почти никто не берёт?

Задание 16 выглядит страшно только на словах: за формулировкой про системы счисления стоит цикл, одно условие с остатком и один накопитель. Отработайте шаблон на реальных заданиях банка ФИПИ, приучите себя к пяти собственным тестам — и получите два балла там, где 96 % участников получают ноль.