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

#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";

}

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.

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

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 represets 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.

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

Output:

Yes No

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

**C++ Foundation Course**for Basic to Advanced C++ and

**C++ STL Course**for foundation plus STL. To complete your preparation from learning a language to DS Algo and many more, please refer

**Complete Interview Preparation Course**

**.**