# How to check whether a number is in the range[low, high] using one comparison ?

• Difficulty Level : Easy
• Last Updated : 30 Jul, 2021

This is simple, but interesting programming puzzle. Given three integers, low, high and x such that high >= low. How to check if x lies in range [low, high] or not using single comparison. For example, if range is [10, 100] and number is 30, then output is true and if the number is 5, then output is false for same range.
A simple solution is compare x with low and high

Take a step-up from those "Hello World" programs. Learn to implement data structures like Heap, Stacks, Linked List and many more! Check out our Data Structures in C course to start learning today.

## C++

 `#include ``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"``;   ``}`

Output:

```Yes
No```

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

We strongly recommend you to minimize your browser and try this yourself first.
The idea is to compare “x-low” with “high-x”. x is in range [low, high] if and only if x is greater than or equal to low and smaller than or equal to high.

## CPP

 `#include ``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"``;``}`

Output:

```Yes
No```

How does this work for [10, 100] and x = 5?
When we subtract 10 from 5, we get -5 which is considered as UNIT_MAX-4 in unsigned int form. UNIT_MAX is maximum possible unsigned int value. The assumption here is, numbers are stored in 2’s complement form. In 2’s complement form, -1 represents UINT_MAX, -2 represents UINT_MAX-1,..etc.
Thanks to Utkarsh for suggesting this solution.
A Solution that works for negative numbers also
The idea is to multiply (x-low) and (x-high). If x is in range, then it must be greater than or equal to low, i.e., (x-low) >= 0. And must be smaller than or equal to high i.e., (high – x) <= 0. So if result of the multiplication is less than or equal to 0, then x is in range. Else not. Thanks to eva for suggesting this method.

## CPP

 `#include ``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"``;``}`

Output:

```Yes
No```