Программирование
Задание 17 ЕГЭ по информатике: пары соседних чисел — разбор и примеры
В задании 17 к варианту прилагается файл с целыми числами — по одному в строке, обычно несколько тысяч. Нужно рассмотреть пары (или тройки) подряд идущих элементов и найти количество тех, что удовлетворяют условию, а также максимальную или минимальную сумму среди них. Условие почти всегда составное: что-то про цифры чисел, кратность, сравнение с характеристикой всей последовательности (минимум, максимум, среднее). Задание решается программой из 10–15 строк, и главная сложность — без ошибок перевести словесное условие в код.
Что проверяет задание
- умение прочитать числа из файла в список;
- умение перебрать пары соседних элементов по индексам i и i + 1;
- умение вычислять характеристики последовательности: минимум среди чисел, оканчивающихся на 5, максимум среди трёхзначных и т. п.;
- аккуратность в работе с отрицательными числами: последняя цифра, «трёхзначность», остаток от деления.
Типичные формулировки
- «Определите количество пар последовательности, в которых хотя бы одно число трёхзначное, а сумма элементов пары кратна минимальному элементу последовательности, оканчивающемуся на 5. В ответе запишите количество таких пар и максимальную из сумм элементов таких пар».
- «…ровно один из элементов пары делится на 7…» — условие «ровно один» записывается через
!=для двух логических значений. - «…произведение элементов пары меньше квадрата максимального элемента…».
- Тройки: «назовём тройкой три идущих подряд элемента…» — перебор по i, i + 1, i + 2.
Под парой понимаются два идущих подряд элемента; пары могут перекрываться: элементы 1–2, 2–3, 3–4 и т. д. Если в последовательности N чисел, пар всего N − 1.
Пошаговый метод
- Прочитайте файл в список целых чисел.
- Вычислите характеристику последовательности (минимум, максимум, среднее) один раз до основного цикла — не внутри него.
- Запишите проверки свойств отдельными функциями: «трёхзначное», «оканчивается на 5». Для отрицательных чисел используйте
abs. - Переберите пары циклом
for i in range(len(a) - 1). - Соберите подходящие суммы в список и выведите его длину и максимум (или минимум).
- Проверьте программу на маленьких данных, посчитав ответ вручную.
Разбор примера
Последовательность (в реальном задании числа берутся из файла, здесь данные даны в тексте):
125, 340, 35, 210, 90, 15, 600, 45, 300, 1015, 20, 70, 155, 80.
Найдите количество пар соседних элементов, в которых хотя бы одно число трёхзначное, а сумма элементов пары кратна минимальному элементу последовательности, оканчивающемуся на 5. В ответе запишите количество пар и максимальную из их сумм.
Шаг 1. Характеристика. Числа, оканчивающиеся на 5: 125, 35, 15, 45, 1015, 155. Минимальное — 15.
Шаг 2. Перебор пар. Всего 13 пар. Отметим подходящие:
| Пара | Сумма | Есть трёхзначное | Кратна 15 | Подходит |
|---|---|---|---|---|
| 125, 340 | 465 | да | да | да |
| 340, 35 | 375 | да | да | да |
| 35, 210 | 245 | да | нет | нет |
| 210, 90 | 300 | да | да | да |
| 90, 15 | 105 | нет | да | нет |
| 15, 600 | 615 | да | да | да |
| 600, 45 | 645 | да | да | да |
| 45, 300 | 345 | да | да | да |
| 300, 1015 | 1315 | да | нет | нет |
| 1015, 20 | 1035 | нет | да | нет |
| 20, 70 | 90 | нет | да | нет |
| 70, 155 | 225 | да | да | да |
| 155, 80 | 235 | да | нет | нет |
Обратите внимание: 1015 — четырёхзначное число, поэтому пара (1015, 20) не подходит, хотя её сумма кратна 15.
Шаг 3. Ответ. Подходящих пар 7, наибольшая сумма 645. Ответ: 7 645.
Код на Python
Шаблон для файла (числа по одному в строке):
a = [int(s) for s in open('17.txt')]
m = min(x for x in a if abs(x) % 10 == 5)
def three(x):
return 100 <= abs(x) <= 999
sums = []
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
if (three(x) or three(y)) and (x + y) % m == 0:
sums.append(x + y)
print(len(sums), max(sums))Для нашего примера достаточно заменить первую строку на a = [125, 340, 35, 210, 90, 15, 600, 45, 300, 1015, 20, 70, 155, 80] — программа выведет 7 645.
Для троек меняется только цикл: for i in range(len(a) - 2) и элементы a[i], a[i + 1], a[i + 2]. Условие «ровно одно из чисел делится на 7» для пары удобно записать как (x % 7 == 0) != (y % 7 == 0), а «хотя бы два из трёх» — через сумму логических значений: (p) + (q) + (r) >= 2.
Частые ошибки
- Последняя цифра отрицательного числа: в Python
-25 % 10равно 5, но-23 % 10равно 7. Используйтеabs(x) % 10. - Трёхзначность без модуля: число −512 тоже трёхзначное, проверяйте
100 <= abs(x) <= 999. - Вычисляют минимум внутри цикла по уже просмотренной части, а не по всей последовательности.
- Выходят за границу списка: цикл до
len(a)вместоlen(a) - 1даёт ошибку IndexError. - Путают «пару» с любыми двумя элементами: в задании 17 пара — это соседние элементы.
- Неверный формат ответа: два числа через пробел, сначала количество, затем сумма.
Как проверить себя и сэкономить время
Перед запуском на полном файле создайте маленький файл из 6–8 чисел, для которого ответ легко посчитать вручную, и убедитесь, что программа выдаёт то же самое. Особенно полезно включить в такой тест отрицательное число, оканчивающееся на 5, четырёхзначное число и пару, у которой выполняется только одно из условий. Если программа на тесте ошибается, ищите ошибку в переводе условия — почти всегда она именно там.
Ещё один приём — выводить промежуточные данные: характеристику последовательности (минимум, максимум) и первые несколько подходящих пар. По ним видно, правильно ли понято условие. На само задание обычно уходит 5–7 минут, поэтому имеет смысл заранее выучить шаблон чтения файла и перебора пар наизусть.
Потренируйтесь
Решите несколько задач с разными условиями: задания № 17 в банке. Программу можно отправить на автоматическую проверку в задачах с проверкой кода. Следующая тема — задание 18: робот на клеточном поле.