#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))]))