检查十个布尔值中至少有两个为真

3

如果三个布尔值中至少有两个为true,那么以下是最简单的方法来判断:

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

如果有十个布尔值且至少两个需要为真,那么最佳解决方案将是什么?提前致谢。
2个回答

5

您原来的实现不够优化-您可以直接对真值求和:

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;

假设所使用的编程语言将布尔值true提升为整数值1——我认为大多数现代常见的编程语言都是这样的,但最好指出这种假设。我记得至少有一种语言,其中布尔值true提升为全1位模式,因此在这种情况下显然无法工作(目前无法确定是哪种语言,可能甚至不是“真正”的语言,而是学术玩具之类的…)。即使是这种情况,您也可以使用条件语句或其他方式重写此模式... - twalberg
1
@twalberg,当然可以...但我觉得在这种情况下,在任何语言中编写自己的转换方法都不应该很难 :) - Chuck Norris
1
是的 - 这对所有类C语言(以及许多其他语言)都是正确的,而且OP显然正在使用Objective-C。但是对于一个真值不等于1的语言,相同的一般方法仍然应该是可行的,只需要进行一些调整即可。 - Paul R

1
在 C 语言中,您可以直接对变量进行求和检查。
return a + b + .... + n >= 2;

如果您的语言中没有从布尔值到整数的隐式转换,您可以将变量转换为整数并检查转换后的值之和。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接