#1-27 номера ЕГЭ по информатике
March 13, 2023
Разбор теории для 1️⃣5️⃣-го номера ЕГЭ по информатике 2023 года
Условие: Тип 15 № 34521
Обозначим через m & n
поразрядную конъюнкцию неотрицательных целых чисел m и n.
Например, 14 & 5 = 1110_2 & 0101_2 = 0100_2 = 4.
Для какого наибольшего целого числа А формула
x & 51 = 0 ∨ (x & 41 = 0 → x & А = 0)
тождественно истинна (т. е. принимает значение 1 при любом неотрицательном целом значении переменной x)?
Комментарии к первому варианту решения задачи:
- создаем свою функцию для обработки формулы логики из условия, функция принимает всего два аргумента
- возвращаем значение логической функции из условия
- создадим пустой список для удобства поиска наибольшего подходящего числа
- пробегаем диапазон неотрицательных целых чисел через
range()
- для каждого нового взятого числа
А
создаем переменную со значениемTrue
- таким же образом пробегаем диапазон для переменной
х
- просто большое кол-во чисел - если функция при переданных ей аргументах вернет ложь, то такое
А
нам не подходит по условию - в таком случае меняем переменную
flag
наFalse
значение - и прерываем цикл перебора переменной
х
, так как это просто трата времени - но если же пройдя всезначения диапазона
х
переменной, ни разу не произошелbreak
и значениеflag
равноTrue
, то такое числоА
нам подходит по условию – приА
формула тождественно истинна при любыхх
(большом кол-ве) - добавляем подходящее число в список
R
- и выводим максимальный элемент из всех подходящих чисел
А
, лежащих в спискеR
# Код решения Вариант 1 def F(x, A): return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0)) R = [] for A in range(0, 1000): flag = True for x in range(0, 1000): if F(x, A) == False: flag = False break if flag == True: R.append(A) print(max(R))
Комментарии ко второму варианту решения задачи:
1-4. строки идентичные прошлому решению
- пробегаем подходящие по условию целые, неотрицательные числа А
- если все функции в
all()
буду истинными, то условиеif
истинно - добавляем подходящее число
А
в списокR
- и выводим максимальный элемент из всех подходящих чисел
А
, лежащих в спискеR
# Код решения Вариант 2 def F(x): return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0)) R = [] for A in range(0, 1000): if all(F(x) for x in range(0, 1000)): R.append(A) print(max(R))
Комментарии к третьему варианту решения задачи:
- обратите внимание, если пробегать диапазон от большего к меньшему, то первое найденное число будет - наибольшим
- если все функции в
all()
будут истинными, то условиеif
истинно - выводим подходящее число
А
на экран - и прерываем цикл перебора, чтобы остаться с наибольшим подходящим
А
# Код решения Вариант 3 def F(x): return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0)) for A in range(1000, -1, -1): if all(F(x) for x in range(0, 1000)): print(A) break
Комментарии к четвертому варианту решения задачи:
- пробегаем диапазон целых неотрицательных чисел
- если все функции в
all()
буду истинными, то условиеif
истинно - выводим на экран первое подошедшее число
- так как мы пробегали убывающий диапазон, то первое - будет наибольшим
# Код решения Вариант 4 for A in range(1000, -1, -1): if all(((x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))) for x in range(0, 1000)): print(A) break
Комментарии к пятому варианту решения задачи:
# Код решения Вариант 5 print(max([A for A in range(0, 1000) if all(((x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))) for x in range(0, 1000))]))