Побитовая коньюкция

//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; }
}

"По-моему, так" (с) Пух

Но меня терзают смутные сомнения, что надо что-то более умное, чем простой перебор...

→ Ссылка