Проверьте, что по крайней мере два из десяти булевых значений верны
В случае, если по крайней мере два из трех логических значений верны, это самый простой способ выяснить:
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;
Если в вашем языке неявное преобразование из логического в целое число отсутствует, вы можете просто преобразовать переменные в целое и проверить сумму преобразованных значений.