【问题标题】:check at least two out of ten booleans are true检查至少十分之二的布尔值是真的
【发布时间】:2012-10-27 15:38:37
【问题描述】:

如果三个布尔值中至少有两个为真,这是最简单的找出方法:

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

如果有十个布尔值并且其中至少两个必须为真,那么最佳解决方案是什么?提前致谢。

【问题讨论】:

    标签: language-agnostic logic boolean-logic boolean-operations


    【解决方案1】:

    您的原始实现是次优的 - 您可以对真实值求和:

    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,这是可行的——我认为这对于大多数常见的现代语言都是正确的,但值得指出这个假设。我似乎记得至少一种语言,其中 boolean true 提升为全 1 位模式,所以在那种情况下这显然行不通(我现在无法确定它是什么语言,甚至可能没有是一个“真正的”,但一个学术玩具或什么的......)。即使是这种情况,您也可以使用条件或其他东西重写此模式......
    • @twalberg,是的,当然......但我认为在这种情况下,用任何语言编写自己的转换方法都不应该是 ahrd :)
    • 是的——这适用于所有类 C 语言(除此之外还有很多),并且 OP 显然使用的是 Objective-C。但是对于 true 不等于 1 的语言,相同的通用方法应该仍然可行,但需要进行一些调整。
    【解决方案2】:

    在 C 中,您可以只检查变量的总和

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

    如果您的语言不支持从布尔到整数的隐式转换,您可以简单地将变量转换为整数并检查转换值的总和。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2011-03-05
      • 2020-12-31
      • 2015-09-22
      • 2020-01-19
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多