Самый простой способ определить, что для 5 переменных x, y, z, a, b, что a и b равны либо x, y, либо z

#c #variables

#c #переменные

Вопрос:

Так, например, x = a, y = b было бы нормально, в основном проверяя, являются ли a и b элементами {x, y, z}. Для x, y, z, a, b все целые числа в c . Как бы я вообще подошел к такой проблеме элегантным способом? Мой текущий способ — это множество предложений if…

Ответ №1:

Я вижу только самый простой подход:

 if (((a==x) || (a==y) || (a==z)) amp;amp;
    ((b==x) || (b==y) || (b==z)))
...
  

Может быть интересно понять, что большинство компиляторов оптимизированы, поэтому представьте, что a==x действительно, следующие части OR -предложения не будут выполнены, что true || whatever || whatever дает true .

Очевидно, что мой ответ основан на предположении (как вы написали), что есть только три значения ( x , y и z ) для сравнения. В случае, если их больше, например, несколько десятков или сотен или даже больше, вы можете поместить их в отсортированную коллекцию и выполнить некоторый двоичный поиск, но это выходит за рамки этого ответа.

Ответ №2:

Вы можете отсортировать x, y, z и a,b. Тогда вам нужно проверить только три случая: a== x amp;amp; b ==y; a==x amp;amp; b ==z; a== y amp;amp; b == z; Я не вижу более элегантного способа сделать это.

Комментарии:

1. А что, если a== z и b ==x?

2. Вы отсортировали x, y, z и a, b, так что вы знаете, что a <= b и x <= y <= z . Если бы a было равно z, а b равно x, это означало бы, что x == y ==z, и вы нашли бы ответ в одном из случаев, которые мы проверяем.

3. Может быть, и так, но сортировка требует производительности, конечно, если вы делаете это общим способом. Поместите это в некоторые циклы for, и постоянная сортировка может привести к серьезным потерям производительности.