15.04 Побитовая конъюнкция
Ошибка.
Попробуйте повторить позже
Обозначим через поразрядную конъюнкцию неотрицательных целых чисел
и
.
Так, например, .
Для какого наименьшего целого числа формула
тождественно истинна (т. е. принимает значение 1 при любом неотрицательном целом значении
переменной )?
Решение аналитически
Для начала упростим данное выражение:
Отделим скобками известную часть выражения от части с :
Сделаем отрицание известной части, чтобы найти те значения , которые будут давать истину для
отрицания. Тогда они будут обязаны выполняться для условия с
:
Выпишем поразрядную конъюнкцию :
Значит для истинности отрицания числа должны в двоичном виде принимать вид
, где
x – любая цифра.
Теперь выпишем поразрядную конъюнкцию с учётом известных цифр в числах
:
Условие выполнится, если хотя бы одна цифра на месте
будет равна 1. Значит в
числах
обязательно должна быть единица в 5 разряде. Выпишем числа
, которые дают истину для
отрицания известной части:
.
Для всех таких чисел должно быть истинным условие
. Значит, двоичная запись числа
обязательно должна иметь вид
, чтобы при поразрядной конъюнкции с любым числом
получался в результате хотя бы один разряд 1. Значит наименьшее число
имеет значение
. Ответ
.
Идея решения:
Перебираем целые неотрицательные значения с помощью цикла for, чтобы найти наименьшее
подходящее. Для каждого
проверяем тождественную истинность выражения
для всех неотрицательных целых , перебирая их с помощью вложенного цикла for. Для проверки
условия поразрядной конъюнкции чисел используем операцию &. Если найдётся хотя бы одно значение
, для которого выражение ложно, текущее
отбрасываем. Первое
, для которого выражение
истинно для всех перебранных
, и будет искомым наименьшим.
Решение программой:
# Перебор возможных значений A с помощью цикла for def f(a): # Перебор неотрицательных целых x с помощью вложенного цикла for for x in range(1000): # Проверяем тождественную истинность формулы с операцией & для поразрядной конъюнкции if not ((x & 17 == 0) <= ((x & 33 != 0) <= (x & a != 0))): return False return True # Перебор A для поиска наименьшего подходящего for a in range(1000): if f(a): print(a) break
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!