Проверьте, что по крайней мере два из десяти булевых значений верны

В случае, если по крайней мере два из трех логических значений верны, это самый простой способ выяснить:

BOOL a, b, c;
-(BOOL)checkAtLeastTwo
{
  return a && (b || c) || (b && c); 
}

Каково будет оптимальное решение, если существует десять логических значений, и как минимум два из них должны быть истинными? Заранее спасибо.

2 ответа

Решение

Ваша первоначальная реализация является неоптимальной - вы можете просто суммировать истинные значения:

return (int)a + (int)b + (int)c >= 2;

Очевидно, вы можете расширить это до 10 переменных:

return (int)a + (int)b + (int)c + (int)d + (int)e +
       (int)f + (int)g + (int)h + (int)i + (int)j >= 2;

В C вы можете просто проверить сумму ваших переменных

return a + b + .... + n >= 2;

Если в вашем языке неявное преобразование из логического в целое число отсутствует, вы можете просто преобразовать переменные в целое и проверить сумму преобразованных значений.

Другие вопросы по тегам