Рубрики

Как проверить, находится ли число в диапазоне [низкий, высокий], используя одно сравнение?

Это простая, но интересная головоломка для программирования. Даны три целых числа, low, high и x такие, что high> = low. Как проверить, находится ли х в диапазоне [низкий, высокий] или нет, используя одиночное сравнение. Например, если диапазон равен [10, 100], а число равно 30, то вывод равен true, а если число равно 5, то вывод равен false для того же диапазона.

Простое решение — сравнить х с низким и высоким

#include <iostream>
использование пространства имен std;

// Возвращает true, если x находится в диапазоне [low..high], иначе false
bool inRange (без знака низкий, без знака высокий, без знака x)
{
возврат (низкий <= x && x <= высокий);
}

int main ()
{
inRange (10, 100, 30)? cout << Да / n: cout << Нет / n;
inRange (10, 100, 5)? cout << Да / n: cout << Нет / n;
}

Выход:

Yes
No

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

Мы настоятельно рекомендуем вам свернуть браузер и попробовать это в первую очередь.

Идея состоит в том, чтобы сравнить «х-низ» с «х-х». x находится в диапазоне [low, high] тогда и только тогда, когда x больше или равно low и меньше или равно high.

#include <iostream>

using namespace std;

  
// Возвращает true, если x находится в диапазоне [low..high], иначе 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";

}

Выход:

Yes
No

Как это работает для [10, 100] и x = 5?
Когда мы вычитаем 10 из 5, мы получаем -5, который рассматривается как UNIT_MAX-4 в виде без знака int. UNIT_MAX — максимально возможное значение типа unsigned int. Здесь предполагается, что числа хранятся в форме дополнения 2. В форме дополнения 2 -1 представляет UINT_MAX, -2 представляет UINT_MAX-1 и т. Д.

Спасибо Utkarsh за предложение этого решения.

Решение, которое работает и для отрицательных чисел
Идея состоит в том, чтобы умножить (х-низкий) и (х-высокий). Если x находится в диапазоне, то он должен быть больше или равен low, т. Е. (X-low)> = 0. И должен быть меньше или равен high, т. Е. (High — x) <= 0. Так что если результат умножения меньше или равен 0, тогда x находится в диапазоне. Остальное нет. Спасибо Ева за предложение этого метода.

#include <iostream>

using namespace std;

  
// Возвращает true, если x находится в диапазоне [low..high], иначе 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";

}

Выход:

Yes
No

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Как проверить, находится ли число в диапазоне [низкий, высокий], используя одно сравнение?

0.00 (0%) 0 votes