Побитовая коньюкция
//x&51 = 0 ∨ (x&41 = 0 → x&А = 0)
for(unsigned int A = 1;A<= 32;A++)
{
unsigned flag = 1;
for(unsigned int x = 1;x<=32;x++)
{
if(!(((x&51)!= 0) + (((x&41)==0)) || ((x&A)== 0)))
flag = 0;
}
if(flag)
{
cout<<A<<endl;break;
}
}
Ответ:41,у меня выводит 1
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Надо найти A ∨ (B → C). Но: (B → C) <=> (!B ∨ С)
Так что получаем A ∨ (!B ∨ C).
Если решать просто перебором, то получается
for(unsigned int A = 0; A <= 0xFF; ++A)
{
int ok = true;
for(unsigned int x = 0; x <= 0xFF; ++x)
if (!(((x&51)==0) || ((x&41) != 0) || ((x&A) == 0)))
{ ok = false; break; }
if (ok) cout << A << endl;
}
Выводятся
0
1
8
9
32
33
40
41
Наибольшее — 41.
Если развернуть цикл, сразу выводим наибольшее значение:
for(unsigned int A = 0xFF; A < 0xFFFF; --A)
{
int ok = true;
for(unsigned int x = 0; x <= 0xFF; ++x)
if (!(((x&51)==0) || ((x&41) != 0) || ((x&A) == 0)))
{ ok = false; break; }
if (ok) { cout << A << endl; break; }
}
"По-моему, так" (с) Пух
Но меня терзают смутные сомнения, что надо что-то более умное, чем простой перебор...