Все статьи по ЕГЭ
4 сент. 2025 г. - 25 мин. чтения
ЕГЭ Задание 15

ЕГЭ Задание 15

Преобразование логических выражений

@ashtana

Штана Альберт Игоревич

Типы заданий № 15

В этой статье будет разобрано задание 15.

Рассмотрим типовые задачи из пятнадцатого задания ЕГЭ по информатике.

Данное задание относится к повышенному уровню сложности.

Время выполнения задания ≈ 3 минуты.

Данный тип задач проверяет знания основных понятий и законов математической логики.

Про основы алгебры логики ссылка на статью.

Задача 1 (Неравенство с одной переменной)

Какое количество натуральных чисел удовлетворяет логическому условию:

Решение:
Решение Python
k = 0
for x in range(1, 1000):
    if not(x**2 >= 9) or not((x < 7) or (x >= 10)):
        k += 1
print(k)

Заводим переменную счётчик в которой будет ответ. Перебираем с помощью цикла for натуральные числа от 1 до 1000 (можно и меньше 1000, но лучше проверить больший диапазон чисел). Внутри цикла пропишем после оператора if логическое выражение. Если логическое вернуло True (истина), то подсчитываем такой вариант в переменную счётчика. В конце работы цикла выводим на консоль ответ на задачу: значение переменной счётчика.

Ответ: 5

Задача очень проста. Рассмотрим далее другие варианты и посложнее.

Задача 2 (Неравенство с тремя переменными)

Для какого наибольшего целого неотрицательного числа A выражение: тождественно истинно, т.е. принимает значение 1 при любых целых положительных x и y?

Решение:
Решение Python
mx = 0
for A in range(0, 100):
    k = 0
    for X in range(1, 301):
        for Y in range(1, 301):
            if (X >= A) or (Y >= A) or (X * Y <= 205):
                k += 1
    if k == 300 * 300:
        mx = max(mx, A)
print(mx)
  1. Заводим переменную по которой будем вычислять максимальное значение для А;
  2. В цикле for перебираем возможные значения для A;
  3. Каждую итерацию цикла for для A инициализируем переменную счётчик нулём;
  4. Создаём цикл for для перебора значений X;
  5. Внутри цикла for для X создаём цикл for для Y. Таким образом перебираем все возможные комбинации X и Y;
  6. Внутри цикла для условия if прописываем логическое выражения из задания. Если бы у нас в задании спросили тождественно ложно — тогда можно всё выражение взять в скобки и инвертировать через оператор not;
  7. Увеличиваем переменную счётчика k на 1 если прошли условие в операторе if;
  8. Далее когда двое циклов отработали проверяем чтобы значение переменной счётчика соответствовало количеству запусков обоих циклов для X и Y;
  9. Вычисляем максимальное значение для A через функцию max;
  10. Вывод ответа на задачу в консоль.

Ответ: 15

Задача 3 (Функция ДЕЛ)

Обозначим через DEL(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Для какого наибольшего натурального числа А формула:

А тождественно истинна (то есть принимает значение 1 при любом натуральном значении переменной x)?

Решение:
Решение Python
def dl(n, m):
    if n % m == 0:
        return True
    return False


mx = 0
for A in range(1, 100):
    k = 0
    for X in range(1, 1001):
        if dl(X, A) or (not (dl(X, 6)) or not (dl(X, 9))):
            k += 1
    if k == 1000:
        mx = max(mx, A)
print(mx)

Здесь решение аналогично прошлой задаче за некоторым изменением. Вначале нужно задать функцию dl которая будет проверять утверждение «натуральное число n делится без остатка на натуральное число m». Далее в циклах "прокрутим" значения для A и для X. Внутри цикла для X делаем проверку условия из выражения с вызовами функции DEL (dl). После цикла for для X и внутри цикла for для A нужно проверить счётчик. Значение в переменной счётчика k должно совпадать с количеством запусков цикла for для X если это так — вычисляем максимум. После тогда как перебрали циклами все значения для A и для X — выводим значение переменной максимума mx в консоль как ответ на задачу.

Ответ: 18

Задача 4 (Поразрядная конъюнкция)

Обозначим через m&n поразрядную конъюнкцию неотрицательных целых чисел m и n. Например: Для какого наименьшего неотрицательного целого числа A формула: тождественно истинна (то есть принимает значение 1 при любом неотрицательном целом значении переменной x)?

Решение:
Решение Python
for A in range(0, 100):
    k = 0
    for X in range(0, 1000):
        if X & 51 == 0 or (X & A != 0 or X & 25 != 0):
            k += 1
    if k == 1000:
        print(A)
        break  # Как только нашли ответ — выходим из цикла

Циклами перебираем значения для A и для X. A, и X — неотрицательные числа поэтому перебираем их диапазон, начиная с нуля. Не забываем, при проверке выражения в условии if, преобразовывать операцию следование. После отработки цикла for для X проверяем чтобы в переменной счётчика k было значение равное количеству запусков цикла для переменной X. Так как циклы начинаются с нуля то как только условие проверки по счётчику будет пройдено — это и будет минимальное A. Выводим ответ на задачу и прерываем цикл.

Ответ: 34

Задача 5 (Наименьшая длина отрезка)

На числовой прямой даны отрезки P=[5, 13] и Q=[8, 19]. Укажите наименьшую возможную длину такого отрезка A, что формула: тождественно истина при любых значениях x.

Решение:
Решение Python
def f(a, b, x):
    if a <= x <= b:
        return True
    return False


mn = 10 ** 9
for a in range(0, 100):
    for b in range(a, 100):
        k = 0
        for i in range(1, 200):
            x = i / 2
            if not (f(5, 13, x) or f(8, 19, x)) or f(a, b, x):
                k += 1
        if k == 199:
            mn = min(mn, b - a)
print(mn)

Сначала напишем функцию *f, которая будет проверять принадлежность точки x к отрезку [a, b]. Заводим переменную mn в которую будем записывать вычисление минимального отрезка A. A — это отрезок и его значения мы перебираем с помощью двух циклов for для возможных значений a и для b. Внутри циклов для каждого отрезка A заводим переменную счётчик k. В задачах на отрезки нужно, чтобы переменная x перебиралась как дробное число. Для этого используем вспомогательный цикл for с i. _Отрезок A перебираем с нуля, а цикл i начинаем перебирать с 1 из-за исключительной ситуации с нулями. Диапазон range цикла i создаём примерно в два раза больше по сравнению с циклом a. И внутри этого цикла получаем переменную x = i/2. Таким образом, диапазон для переменной x будет примерно таким же, как и для переменной a, только шаг у переменной x - 0,5. Затем подсчитываем в счётчик k, сколько раз выполнится логическая функция. После цикла i, проверяем счёт k. Если при каждом проходе цикла, логическая функция выдавала истину, то отрезок A подходит. В ответе нужно написать минимальную длину отрезка. Используем функцию min, чтобы найти минимальный отрезок.

Ответ: 14

Задача 6 (Наибольшая длина отрезка)

На числовой прямой даны два отрезка: P = [43; 49] и Q = [44; 53]. Укажите наибольшую возможную длину такого отрезка A, что формула: тождественно истинна, то есть принимает значение 1 при любых x.

Решение:
Решение Python
def f(a, b, x):
    if a <= x <= b:
        return True
    return False


def fa(a, b, x):
    if a < x < b:
        return True
    return False


mx = 0
for a in range(0, 100):
    for b in range(a, 100):
        k = 0
        for i in range(1, 200):
            x = i / 2
            if (not (fa(a, b, x)) or f(43, 49, x)) or f(44, 53, x):
                k += 1
        if k == 199:
            mx = max(mx, b - a)
print(mx)

При поиске отрезка максимальной длины, нужно создать функцию fa со строгим неравенством и её применять только к отрезку A.

Ответ: 10

Задача 7 (Функция и отрезок)

Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Пусть на числовой прямой дан отрезок B = [70, 90]. Для какого наибольшего натурального числа А логическое выражение ДЕЛ(x, А) ∨ ((x ∈ B) → ¬ДЕЛ(x, 22)) истинно (т.е. принимает значение 1) при любом целом положительном значении переменной х?

Решение:
Решение Python
def dl(n, m):
    if n % m == 0:
        return True
    return False


def f(a, b, x):
    if a <= x <= b:
        return True
    return False


mx = 0
for A in range(1, 200):
    k = 0
    for x in range(1, 201):
        if dl(x, A) or (not (f(70, 90, x)) or not (dl(x, 22))):
            k += 1
    if k == 200:
        mx = max(mx, A)
print(mx)

Задача гибрид в которой деление и есть элементы задания на отрезки. Искомая переменная A - это обычное число, не отрезок. Логика решения задачи такая же как в прошлых задачах.

Ответ: 88

Задача 8 (Демоверсия ЕГЭ 2024)

Для какого наименьшего целого неотрицательного числа A выражение: тождественно истинно, т.е. принимает значение 1 при любых целых неотрицательных x и y?

Решение:
Решение Python
for A in range(0, 200):
    k = 0
    for x in range(0, 200):
        for y in range(0, 200):
            if (x + 2*y < A) or (y > x) or (x > 60):
                k += 1
    if k == 200*200:
        print(A)
        break

В цикле перебираем все возможные значения A, а затем также в двух циклах перебираем значения x, y. Т.к. в задании говорится про целые неотрицательные числа и в ответ нужно указать число A значит оно будет в первом цикле перебираться сначала, а потом уже все x и y. Изначально стоит выбирать небольшие значения для циклов например 20, 50, 100, 150. Я нашёл решение только когда прописал диапазон до 200(функция range). В 3 цикле с y проверяем само выражение(если бы в задаче спрашивали про ложность, то необходимо было всё выражение взять в скобочки и инвертировать через not). И последнее в условии в цикле для A проверяем в конце то что x, y были любыми целыми числами(два цикла по 200, результат счётчика 200*200). Если это так, то выводим ответ на задачу и прерываем цикл, чтобы программа быстрее завершилась и не "перебирала" дальше.

Ответ: 181

Задача 9 (Демоверсия ЕГЭ 2025)

На числовой прямой даны два отрезка: P = [15; 40] и Q = [21; 63]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение: истинно (т.е. принимает значение 1) при любом значении переменной х.

Решение:
Решение Python
answer = 9999999999999
for a in range(0, 100):
    for b in range(a, 100):
        counter = 0
        for i in range(2, 200):
            x = i / 2
            if not (15 <= x <= 40) or (not (21 <= x <= 63 and not (a <= x <= b)) or not (15 <= x <= 40)):
                counter += 1
        if counter == 198:
            answer = min(answer, b - a)
            break
print(answer)
  1. Заводим переменную answer с большим значением(т.к. нужно найти минимум) под ответ задачи.
  2. В циклах перебираем все возможные значения отрезка A(a - начало отрезка, b - конец) и вначале работы второго цикла заводим переменную счётчик(counter = 0) для каждого отрезка A, которую далее будем проверять.
  3. Затем в цикле перебираем значения x. В задачах на отрезки переменная x должна быть дробным числом. Это можно сделать: указав шаг в функции range или использовать переменную цикла как вспомогательную. В решении используем переменную i как вспомогательную и затем внутри этого цикла получаем x = i / 2 (здесь идёт обычное деление потому что мы хотим именно дробные значения для x). И т.к. отрезок A начинается с 0, цикл i начинаем с 2 (это связанно с коллизией или исключительной ситуацией). Диапазон цикла для i всегда выбираем в 2 раза больше чем для a b. p.s. Можно также найти решение с меньших значений у циклов например 50 для a и b и 100 для i.
  4. В 3 цикле с x проверяем само выражение(если бы в задаче спрашивали про ложность, то необходимо было всё выражение взять в скобочки и инвертировать через not). Следование делается по формуле A ⟶ B = ¬A ∨ B. Если условие соблюдается то внутри условия увеличиваем счётчик на 1.
  5. И последнее в условии в цикле для A проверяем в конце то что счетчик каждое условие посчитал, т.е. сколько было запусков цикла i столько раз и увеличивался счётчик на 1. Если это так, то вычисляем минимум функцией min и прерываем цикл(чтобы программа быстрее завершилась и не "перебирала" дальше) и выводим ответ на задачу.

Ответ: 19

Задача 10 (Демоверсия ЕГЭ 2026)

На числовой прямой даны два отрезка: P = [25; 64] и Q = [40; 115]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение: истинно (т.е. принимает значение 1) при любом значении переменной х.

Решение:
Решение Python
answer = 9999999999999
for a in range(0, 100):
    for b in range(a, 100):
        counter = 0
        for i in range(2, 200):
            x = i / 2
            if not (25 <= x <= 64) or (not (40 <= x <= 115 and not (a <= x <= b)) or not (25 <= x <= 64)):
                counter += 1
        if counter == 198:
            answer = min(answer, b - a)
            break
print(answer)
  1. Заводим переменную answer с большим значением(т.к. нужно найти минимум) под ответ задачи.
  2. В циклах перебираем все возможные значения отрезка A(a - начало отрезка, b - конец) и вначале работы второго цикла заводим переменную счётчик(counter = 0) для каждого отрезка A, которую далее будем проверять.
  3. Затем в цикле перебираем значения x. В задачах на отрезки переменная x должна быть дробным числом. Это можно сделать: указав шаг в функции range или использовать переменную цикла как вспомогательную. В решении используем переменную i как вспомогательную и затем внутри этого цикла получаем x = i / 2 (здесь идёт обычное деление потому что мы хотим именно дробные значения для x). И т.к. отрезок A начинается с 0, цикл i начинаем с 2 (это связанно с коллизией или исключительной ситуацией). Диапазон цикла для i всегда выбираем в 2 раза больше чем для a b. p.s. Можно также найти решение с меньших значений у циклов например 50 для a и b и 100 для i.
  4. В 3 цикле с x проверяем само выражение(если бы в задаче спрашивали про ложность, то необходимо было всё выражение взять в скобочки и инвертировать через not). Следование делается по формуле A ⟶ B = ¬A ∨ B. Если условие соблюдается то внутри условия увеличиваем счётчик на 1.
  5. И последнее в условии в цикле для A проверяем в конце то что счетчик каждое условие посчитал, т.е. сколько было запусков цикла i столько раз и увеличивался счётчик на 1. Если это так, то вычисляем минимум функцией min и прерываем цикл(чтобы программа быстрее завершилась и не "перебирала" дальше) и выводим ответ на задачу.

Ответ: 24

Попробуйте сами запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает. Для этого в ячейке с кодом нажмите клавиши на клавиатуре Shift+Enter или запустите код через кнопку Run по значку ▶.