Условие: Тип 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)?
Решение:
# Код решения Вариант 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))
Комментарии к первому варианту решения задачи:
- создаем свою функцию для обработки формулы логики из условия, функция принимает всего два аргумента
- возвращаем значение логической функции из условия
- -
- создадим пустой список для удобства поиска наибольшего подходящего числа
- пробегаем диапазон неотрицательных целых чисел через range()
- для каждого нового взятого числа А создаем переменную со значением True
- таким же образом пробегаем диапазон для переменной х - просто большое кол-во чисел
- если функция при переданных ей аргументах вернет ложь, то такое А нам не подходит по условию
- в таком случае меняем переменную flag на False значение
- и прерываем цикл перебора переменной х, так как это просто трата времени
- но если же пройдя все значения диапазона х переменной, ни разу не произошел break и значение flag равно True, то такое число А нам подходит по условию – при А формула тождественно истинна при любых х (большом кол-ве)
- добавляем подходящее число в список 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))
Комментарии ко второму варианту решения задачи:
1-4. строки идентичные прошлому решению
5. пробегаем подходящие по условию целые, неотрицательные числа А
6. если все функции в all() буду истинными, то условие if истинно
7. добавляем подходящее число А в список R
8. и выводим максимальный элемент из всех подходящих чисел А, лежащих в списке R
# Код решения Вариант 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
Комментарии к четвертому варианту решения задачи:
- пробегаем диапазон целых неотрицательных чисел
- если все функции в all() буду истинными, то условие if истинно
- выводим на экран первое подошедшее число
- так как мы пробегали убывающий диапазон, то первое - будет наибольшим
# Код решения Вариант 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))]))
Комментарии к пятому варианту решения задачи:
- Данное решение является совокупностью предыдущих, оставим Вам на саморазбор