Побитовая конъюнкция
Пройти тестирование по этим заданиям
Вернуться к каталогу заданий
Версия для печати и копирования в MS Word


Обозначим через
Так, например,
тождественно истинна (т. е. принимает
Приведем аналитическое решение Юрия Красильникова.
Преобразуем исходное выражение
исключив импликацию:
Число 29 в двоичном представлении — это 11101.
Если число x не содержит единиц
С другой стороны, если единицы будут в разрядах
Следовательно, два левых выражения будут ложными, если в числе x есть единицы в разрядах, которые есть
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 32 do begin
B := True;
for x := 0 to 32 do
if not (((x and 29) = 0) or ((x and 17) <> 0) or ((x and A) <> 0)) then
B := False;
if B then begin
writeln(A);
break;
end;
end;
end.
Ответ: 12.
Приведем аналогичную программу на языке Python (Владимир Юрьевич Ламок).
ok=1
A=set()
for a in range (1, 65):
ok=1
for x in range (0, 65):
if ((x & 29 != 0) <= ((x & 17 == 0) <= (x & a != 0))) == 0:
ok=0
if ok:
A.add(a)
break
print(min(A))
Заметим, что можно было перебирать числа
Приведём другое решение на языке Python.
for A in range(0, 1000):
flag = True
for x in range(1000):
f = (x & 29 != 0) <= ((x & 17 == 0) <= (x & A != 0))
if not(f):
flag = False
break
if flag:
print(A)
break
Приведём другое решение на языке Python.
for a in range(0, 1000):
k = 0
for x in range(0, 1000):
if (x & 29 != 0) <= ((x & 17 == 0) <= (x & a != 0)):
k += 1
if k == 1000:
print(a)
break
Приведём решение Ильи Андрианова на языке Python.
def F(x, A):
return (x & 29 != 0) <= ((x & 17 == 0) <= (x & A != 0))
for A in range(0, 1000):
if all(F(x, A) for x in range(0, 10000)):
print(A)
break
Приведём решение Сергея Донец на языке PascalABC.NET.
begin
(0..55).Where(A->(0..55).all(x->
x and 29 <> 0 <= (x and 17 = 0 <= (x and A <> 0))
)).first.println;
end.
Обозначим через m&n поразрядную конъюнкцию неотрицательных целых
Так, например, 14&5 = 11102&01012 = 01002 = 4.
Для какого наименьшего неотрицательного целого
тождественно истинна (т. е. принимает
Преобразуем выражение по законам алгебры логики:
Далее применяем обозначения и реализуем способ решения, изложенный К. Ю. Поляковым в теоретических материалах (см., например, раздел «Теория» на нашем сайте), без дополнительных пояснений.
Имеем импликацию
Импликация принимает вид
17: 010001
A: 1?110?
61: 111101
В записи наименьшего числа, дающего при поразрядной дизъюнкции
Приведём другое решение.
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 63 do begin
B := True;
for x := 0 to 63 do
if not (((x and 28) = 0) and ((x and 45) = 0) or ((x and 17) <> 0) or ((x and A) <> 0)) then
B := False;
if B then begin
writeln(A);
break;
end;
end;
end.
Заметим, что можно не перебирать числа,
Приведём другое решение на языке Python.
for A in range(64):
B = True
for x in range(64):
if ((x&28==0) and (x&45==0) or (x&17!=0) or (x&A!=0))==0:
B=False
if B:
print(A)
break
Ответ: 44.
Приведём решение Сергея Донец на PascalABC.NET:
begin
(0..88).Where(A->(0..88).all(x->
(x and 28<>0)or(x and 45<>0)<=((x and 17=0)<=(x and A<>0))
)).First.Print;
end.
Обозначим через m&n поразрядную конъюнкцию неотрицательных целых
Например, 14&5 = 11102 & 01012 = 01002 = 4.
Для какого наименьшего неотрицательного целого
тождественно истинна (т. е. принимает
Преобразуем выражение по законам алгебры логики:
Далее применяем обозначения и реализуем способ решения, изложенный К. Ю. Поляковым в теоретических материалах (см., например, раздел «Теория» на нашем сайте) без дополнительных пояснений.
Имеем импликацию
Таким образом, наименьшее А = 0011002 = 1210.
Приведём другое решение.
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 63 do begin
B := True;
for x := 0 to 63 do
if not (((x and 33) <> 0) or ((x and 45) = 0) or ((x and A) <> 0)) then
B := False;
if B then begin
writeln(A);
break;
end;
end;
end.
Приведём другое решение на языке Python.
for A in range(64):
B = True
for x in range(64):
if ((x&33!=0) or (x&45==0) or (x&A!=0))==0:
B=False
if B:
print(A)
break
Заметим, что можно не перебирать числа,
Ответ: 12.
Приведём решение Сергея Донец на PascalABC.NET:
begin
(0..90).Where(A->(0..90).all(x->
x and 33=0<=(x and 45<>0<=(x and A<>0))
)).First.Print;
end.
Обозначим через m&n поразрядную конъюнкцию неотрицательных целых
Так, например, 12&6 = 11002&01102 = 01002 = 4.
Для какого наибольшего целого
→ (x&10 = 0 → х&3
)
тождественно истинна (т. е. принимает
Преобразуем выражение по законам алгебры логики:
Далее применяем обозначения и реализуем способ решения, изложенный К. Ю. Поляковым в теоретических материалах (см., например, раздел «Теория» на нашем сайте), без дополнительных пояснений.
Имеем импликацию
Таким образом, наибольшее А = 10112 = 1110.
Приведём другое решение.
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 15 do begin
B := True;
for x := 0 to 15 do
if not (((x and 3) <> 0) or ((x and 10) <> 0) or ((x and (15-A)) = 0)) then
B := False;
if B then begin
writeln((15-A));
break;
end;
end;
end.
Приведём другое решение на языке Python.
for A in range(16):
B = True
for x in range(16):
if ((x&(15-A)==0) or (x&10!=0) or (x&3!=0))==0:
B=False
if B:
print(15-A)
break
Заметим, что можно не перебирать числа,
Ответ: 11.
Приведём решение Сергея Донец на PascalABC.NET:
begin
(0..22).Where(A->(0..22).all(x->
(x and A<>0)<=(x and 10=0<=(x and 3<>0))
)).Last.Print;
end.
Обозначим через m&n поразрядную конъюнкцию неотрицательных целых
Так, например, 14&5 = 11102&01012 = 01002 = 4.
Для какого наибольшего целого
x&51 = 0 ∨ (x&41 = 0 → x&А = 0)
тождественно истинна (т. е. принимает
Преобразуем выражение по законам алгебры логики:
Далее применяем обозначения и реализуем способ решения, изложенный К. Ю. Поляковым в теоретических материалах (см., например, раздел «Теория» на нашем сайте), без дополнительных пояснений.
Заметим, что первое слагаемое логической суммы является импликацией
Действительно, например, для х = 2 поразрядная конъюнкция
2: 000010
41: 101001
2&41: 000000, то есть 2&41 = 0. Высказывание 2&41 = 0 истинно.
2: 000010
51: 110011
2&51: 000010 = 2, то есть 2&51 = 2. Высказывание 2&51 = 0 ложно.
Итак, импликация
Таким образом, наибольшее А = 1010012 = 4110.
Ответ: 41.
Примечание.
Ответ 45 не подходит. Пусть A = 45, а x = 2210 = 101102, тогда:
51: 1100112
22: 0101102
51&22: 0100102, то есть высказывание 22&51 = 0 ложно;
41: 1010012
22: 0101102
41&22: 0000002, то есть высказывание 22&41 ≠ 0 ложно;
45: 1011012
22: 0101102
51&22: 0001002, то есть высказывание 22&45 = 0 ложно.
Следовательно, при x = 22 и A = 45 логическое выражение ложно.
Приведем другое решение.
Выражение
Выражение x&51 = 0 будет ложно, поскольку и
Следовательно, истинной должна быть импликация во второй скобке. Но левая часть импликации x&41 = 0 истинна, поскольку ни один из битов, установленных
Тогда истинной должна быть и правая часть импликации x&А = 0. Следовательно,
При таком А левая и правая части импликации одинаковы. Следовательно, импликация в правой скобке истинна, а значит, истинно и все выражение.
Приведём другое решение.
Решим задание с помощью языка программирования PascalABC методом перебора:
var
A, x: integer;
B: boolean;
begin
for A := 0 to 63 do begin
B := True;
for x := 0 to 63 do
if not (((x and 51) = 0) or ((x and 41) <> 0) or ((x and (63-A)) = 0)) then
B := False;
if B then begin
writeln((63-A));
break;
end;
end;
end.
Приведём другое решение на языке Python.
for A in range(64):
B = True
for x in range(64):
if ((x&51==0) or (x&41!=0) or (x&(63-A)==0))==0:
B=False
if B:
print(63-A)
break
Заметим, что можно не перебирать числа,
Ответ: 41.
Приведём другое решение на языке Python.
for a in range(100, 0, -1):
k = 0
for x in range(100, 0, -1):
if (x & 51 == 0) or (not(x & 41 == 0) or (x & a == 0)):
k += 1
if k == 100:
print(a)
break
Приведём решение Ильи Андрианова на языке Python.
def F(x, A):
return (x&51 == 0) or ((x&41 == 0) <= (x&A == 0))
R = []
for A in range(0, 10_000):
if all(F(x, A) for x in range(0, 10_000)):
R.append(A)
print(max(R))
Приведём решение Сергея Донец на PascalABC.NET:
begin
(0..111).Where(A->(0..111).all(x->
(x and 51=0)or(x and 41=0<=(x and A=0))
)).Last.Print;
end.
Пройти тестирование по этим заданиям
Наверх