3

在至少三分之二的布尔是真实的情况下,这是找出最简单的方法:检查至少两个十个布尔都是真实的

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

会有什么,如果最优解有十个布尔人,至少有两个需要是真的?提前致谢。

回答

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; 
+0

这个工作假设有问题的语言提升布尔值为整数值1--我认为对于大多数常见的现代语言来说这是真的,但值得指出这个假设。我似乎还记得至少有一种语言,布尔真正提升为全1位模式,所以在这种情况下这显然不起作用(不能把我的手指放在当前的语言上,它甚至可能没有一直是一个“真正的”,但学术玩具或其他...)。即使是这样的话,你可以用条件或其他东西来重写这个模式...... – twalberg

+1

@twalberg,当然是......但是我认为在这种情况下它不应该用任何语言编写你自己的转换方法: ) –

+1

是的 - 对于所有类C语言(除此之外还有更多),这是正确的,OP显然使用Objective-C。但对于真实不等于1的语言来说,相同的一般方法仍然可行,并进行一些调整。 –

1

在C语言中,你可以只检查的总和你的变量

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

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

相关问题