ЕГЭ информатика 13 задание разбор, теория, как решать.
Задание №13 ЕГЭ по информатике — IP-сети и маски
Что надо уметь:
- читать IP-адрес и маску:
a.b.c.d/mилиa.b.c.d/255.255...; - понимать, что адрес сети и широковещательный адрес нельзя давать узлам;
- уметь пройти по всем адресам сети и что-то посчитать;
- в Python удобно решать через модуль
ipaddress— он есть на экзамене в демках и в СтатГраде.
Мини-теория
Маска — это 32 бита, сначала 1, потом 0.
Адрес сети = (IP AND Mask).
Широковещательный адрес — тот же адрес сети, но в младших разрядах вместо нулей стоят единицы.
В сети есть:
- адрес сети (первый) — не выдаём;
- адреса узлов — можно выдавать;
- широковещательный (последний) — не выдаём.
В Python:
|
1 2 3 4 5 6 7 |
from ipaddress import * net = ip_network('192.168.32.160/255.255.255.240') # сеть for ip in net: print(ip) # перебор всех адресов сети, включая первый и последний |
Дальше всё сводится к «пройти по сети и отфильтровать». Ниже — типовые случаи.
1. Найти наибольший IP-адрес в сети (демо-2026)
Условие (сокр.): сеть задана IP-адресом узла 191.128.66.83 и маской 255.192.0.0. Найдите в этой сети наибольший IP-адрес, который может быть назначен компьютеру. В ответе — без точек.
|
1 2 3 4 5 6 7 8 |
from ipaddress import * net = ip_network('191.128.66.83/255.192.0.0', 0) max_ip = net[-2] # предпоследний — последний узловой print(max_ip) # 191.191.255.254 print(str(max_ip).replace('.', '')) # 191191255254 |
Ответ: 191191255254
2. Найти наименьший IP-адрес для компьютера (СтатГрад 23.10.2025)
Условие (сокр.): дан узел 167.66.136.176 и маска 255.254.0.0. Определите наименьший IP этой сети, который можно выдать компьютеру. В ответе — сумму октетов.
|
1 2 3 4 5 6 7 8 |
from ipaddress import * net = ip_network('167.66.136.176/255.254.0.0', 0) first_host = net[1] # 0 — адрес сети, 1 — первый узел s = sum(int(x) for x in str(first_host).split('.')) print(s) |
Комментарий: часто в ответ просят «сумму октетов», поэтому после нахождения адреса просто делим по точкам и складываем.
3. Посчитать адреса по условию «количество единиц …» (демо-2025, апробации, СтатГрад)
Это самый частый тип: «Сколько в сети IP-адресов, для которых …».
Алгоритм всегда один:
- создали сеть через
ip_network(..., 0); - пробежались циклом;
- перевели ip в двоичную строку:
f'{ip:b}'илиbin(int(ip))[2:]; - проверили условие;
- сосчитали.
3.1. Демо ЕГЭ 2025 — «число единиц НЕ кратно 5»
|
1 2 3 4 5 6 7 8 9 10 11 |
from ipaddress import * net = ip_network('172.16.168.0/255.255.248.0', 0) cnt = 0 for ip in net: b = f'{ip:b}' if b.count('1') % 5 != 0: cnt += 1 print(cnt) |
Ответ: 1663
3.2. Апробация I 05.03.2025 — «количество единиц НЕ кратно 5» в другой сети
|
1 2 3 4 5 6 7 8 9 10 11 |
from ipaddress import * net = ip_network('172.16.192.0/255.255.192.0', 0) k = 0 for ip in net: b = bin(int(ip))[2:] if b.count('1') % 5 != 0: k += 1 print(k) |
Ответ: 13003
3.3. Демо ЕГЭ 2024 — «сумма единиц чётная»
|
1 2 3 4 5 6 7 8 9 10 |
from ipaddress import * net = ip_network('192.168.32.160/255.255.255.240', 0) k = 0 for ip in net: if bin(int(ip))[2:].count('1') % 2 == 0: k += 1 print(k) |
4. Найти маску по условию на количество IP (СтатГрад 24.10.2024)
Условие (сокр.): узел 121.96.174.205 принадлежит сети, в которой 10 IP-адресов, двоичная запись которых содержит ровно 12 единиц. Сколько единиц в маске?
Идея: маска нам неизвестна → перебираем длину маски от 15 до 32 и смотрим, при каком значении в сети ровно 10 «подходящих» адресов.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from ipaddress import * for mask in range(15, 33): net = ip_network(f'121.96.174.205/{mask}', 0) k = 0 for ip in net: if f'{ip:b}'.count('1') == 12: k += 1 if k == 10: print(mask) break |
Ответ: 22 (т.е. в маске 22 единицы)
5. «A» в одном из октетов (задачи вида 154.127.A.230)
Это уже «олимпиадный» стиль, но на ЕГЭ сейчас тоже появляются.
Сеть задана как 154.127.A.192/255.255.255.192, нужно подобрать такое A, чтобы для всех IP в сети выполнялось какое-то условие.
Шаблон:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from ipaddress import * for A in range(0, 256): ok = True net = ip_network(f'154.127.{A}.192/255.255.255.192', 0) for ip in net: b = f'{ip:b}' # условие: слева больше единиц, чем справа (пример) if b[:16].count('1') <= b[16:].count('1'): ok = False break if ok: print(A) |
Дальше — только меняем условие внутри цикла.
6. Задача «адрес сети и широковещательный нельзя использовать»
В демо и СтатГраде бывают формулировки «найдите наименьший / наибольший адрес, который можно выдать компьютеру».
В модуле ipaddress всё просто:
net[0]— адрес сети;net[-1]— широковещательный;net[1]— первый узловой;net[-2]— последний узловой.
Пример:
|
1 2 3 4 5 6 7 8 |
from ipaddress import * net = ip_network('167.66.136.176/255.254.0.0', 0) first_host = net[1] last_host = net[-2] print(first_host, last_host) |
7. Частые приёмы
- Всегда пишем вторым аргументом
0вip_network(..., 0), чтобы Python не «чиннил» адрес. - Для подсчёта единиц:
bin(int(ip))[2:].count('1')илиf'{ip:b}'.count('1'). - Для ответа «без точек»:
str(ip).replace('.', ''). - Для суммы октетов:
sum(map(int, str(ip).split('.'))). - Если «количество адресов, у которых …», то обычный
for ip in net:и счётчик.
8. Что тренировать
- Демо ЕГЭ 2025 и 2026 — задачи на «НЕ кратно».
- СтатГрад 23.10.2025 — наименьший IP и сумма октетов.
- СтатГрад 24.10.2024 — подбор маски по количеству подходящих адресов.
- Апробация 05.03.2025 — то же самое, но другая сеть.
- Задачи с «A» в октете — перебор от 0 до 255.
Если ученик знает эти 5 шаблонов — он решит 99% вариантов №13.