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