2015-12-28 61 views
-3

我有4个数字(int a,int b,int c,int d)等于rand()%7。我怎样才能发现这些数字是否以最短的方式彼此相等?检查4个数字是否相等的最简单方法?

+1

欢迎来到SO,在提问时请稍微具体一点:您尝试过什么,期望什么等。请参阅[如何提问](http://stackoverflow.com/help/how-to-ask ) – Nehal

+3

通过比较他们? –

+5

如果(a == b && b == c && c == d) – Idos

回答

0

要找出数字是否相等,你可以这样做:

if (a == b && b == c && c == d) 

以上是由在数学中,它指出平等的传递特性支持的条件是:

如果a = b和b = c,则a = c。

鉴于属性,我们可以状态:

如果A = B,B = C,且c = d,则a = C,A = d,且b = d。

来源:Mathwords

1

你可以用一个单一的测试做到这一点:

int x = (1 << a) | (1 << b) | (1<< c) | (1<< d); 
if ((x & (x >> 1)) == 0) 
    printf("a, b, c and d are identical\n"); 

它的工作原理,因为所有的值很小,小于位在int数量。该测试检查x是否为2的幂,只有在a,b,c和d的所有值相同的情况下才会如此。

chux提出了更短的解决方案:

if ((1 << a) == ((1 << b) | (1 << c) | (1 << d))) 
    printf("identical\n"); 

它可能不是比单纯的(a == b && b == c && c == d)在较短的指令数,也不计算时间,这取决于你的平台,编译器,选项的细节...

这里是仅使用一个测试,并适用于更大范围的值,例如所有正int值的更简单的一个:

if (((a - b) | (b - c) | (c - d)) == 0) 
    printf("identical\n"); 
+0

if((1 << a)==((1 << b)|(1 << c)|(1 << d))))printf(“identical \ n”);'? – chux

+0

@chux:很好。你有一个明确的赢家。 – chqrlie

+0

只要你喜欢,它的灵感来自你的工作,只有一小部分变化。怀疑它比'a == b && b == c && c == d'更好,但最好的可能是依赖于编译器。 – chux

相关问题