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

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

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

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


person Shabib    schedule 07.11.2012    source источник


Ответы (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;
person Paul R    schedule 07.11.2012
comment
Это работает при условии, что рассматриваемый язык продвигает логическое значение true к целочисленному значению 1 - я думаю, что это верно для большинства распространенных современных языков, но на это предположение стоит указать. Я, кажется, помню, по крайней мере, один язык, где логическое истинное значение преобразовано в битовый шаблон всего 1 с, так что в этом случае это явно не сработает (не могу понять, на каком языке он был в данный момент, и, возможно, он даже не был настоящим, но академической игрушкой или что-то в этом роде ...). Даже если это так, вы можете переписать этот шаблон, используя условные выражения или что-то в этом роде ... - person twalberg; 07.11.2012
comment
@twalberg, да конечно ... Но я думаю, что в таком случае не стоит писать свой метод конвертации на любом языке :) - person Chuck Norris; 07.11.2012
comment
Да, это верно для всех C-подобных языков (и многих других), и OP, очевидно, использует Objective-C. Но для языка, где истина не равна 1, тот же общий подход все же должен быть жизнеспособным, с некоторой корректировкой. - person Paul R; 07.11.2012

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

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

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

person Chuck Norris    schedule 07.11.2012