¿Cómo verificar si un número está en el rango [bajo, alto] usando una comparación?

Este es un rompecabezas de programación simple, pero interesante. Dados tres enteros, bajo, alto yx tales que alto >= bajo. Cómo verificar si x se encuentra en el rango [bajo, alto] o no usando una comparación simple. Por ejemplo, si el rango es [10, 100] y el número es 30, la salida es verdadera y si el número es 5, la salida es falsa para el mismo rango. 
Una solución simple es comparar x con alto y bajo
 

C++

#include <iostream>
using namespace std;   
// Returns true if x is in range [low..high], else false   
bool inRange(unsigned low, unsigned high, unsigned x)         
{         
 return (low <= x && x <= high);         
}         
int main()         
{         
 inRange(10, 100, 30)? cout << "Yes\n": cout <<"No\n";         
 inRange(10, 100, 5)?  cout << "Yes\n": cout <<"No\n";    
}

Producción: 

Yes
No
  The above solution does two comparisons, 
  Can we do the same task using one comparison?  

Le recomendamos encarecidamente que minimice su navegador y que pruebe esto usted mismo primero.
La idea es comparar «x-bajo» con «alto-x». x está en el rango [bajo, alto] si y solo si x es mayor o igual a bajo y menor o igual a alto. 
 

CPP

#include <iostream>
using namespace std;
 
// Returns true if x is in range [low..high], else false
bool inRange(unsigned low, unsigned high, unsigned x)
{
    return  ((x-low) <= (high-low));
}
 
int main()
{
    inRange(10, 100, 30)? cout << "Yes\n":  cout  <<"No\n";
    inRange(10, 100, 5)?  cout << "Yes\n":  cout  <<"No\n";
}

Producción: 

Yes
No

¿Cómo funciona esto para [10, 100] y x = 5? 
Cuando restamos 10 de 5, obtenemos -5, que se considera UNIT_MAX-4 en forma de entero sin signo. UNIT_MAX es el valor int sin signo máximo posible. La suposición aquí es que los números se almacenan en forma de complemento a 2. En forma de complemento a 2, -1 representa UINT_MAX, -2 representa UINT_MAX-1, etc.
Gracias a Utkarsh por sugerir esta solución. 
Una solución que también funciona para números negativos 
La idea es multiplicar (x-bajo) y (x-alto). Si x está dentro del rango, entonces debe ser mayor o igual que bajo, es decir, (x-bajo) >= 0. Y debe ser menor o igual que alto, es decir, (alto – x) <= 0. Entonces, si resultado de la multiplicación es menor o igual a 0, entonces x está dentro del rango. De lo contrario no. Gracias a eva por sugerir este método.
 

CPP

#include <iostream>
using namespace std;
 
// Returns true if x is in range [low..high], else false
bool inRange(int low, int high, int x)
{
    return ((x-high)*(x-low) <= 0);
}
 
int main()
{
    inRange(10, 100, 30)? cout << "Yes\n":  cout  <<"No\n";
    inRange(10, 100, 5)?  cout << "Yes\n":  cout  <<"No\n";
}

Producción: 

Yes
No

 Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *