📌  相关文章
📜  如何使用一个比较检查数字是否在[low,high]范围内?

📅  最后修改于: 2021-05-25 19:03:51             🧑  作者: Mango

这是简单但有趣的编程难题。给定三个整数,low,high和x,使得high> = low。如何使用单个比较检查x是否在[low,high]范围内。例如,如果范围为[10,100]并且数字为30,则输出为true,如果数字为5,则对于相同范围,输出为false。

一个简单的解决方案是将x与高低进行比较

#include
使用命名空间std;

//如果x在[low..high]范围内,则返回true,否则返回false
bool inRange(无符号低,无符号高,无符号x)
{
return(low <= x && x <= high);
}

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”进行比较。当且仅当x大于或等于低且小于或等于高时,x才在[low,high]范围内。

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

输出:

Yes
No

对于[10,100]和x = 5,这是如何工作的?
当我们从5中减去10时,得到-5,它被视为UNIT_MAX-4(无符号int形式)。 UNIT_MAX是最大可能的无符号int值。这里的假设是,数字以2的补码形式存储。以2的补码形式,-1表示UINT_MAX,-2重新设置UINT_MAX-1等。

感谢Utkarsh提出此解决方案。

也适用于负数的解决方案
这个想法是将(x-low)和(x-high)相乘。如果x在范围内,则它必须大于或等于低,即(x-low)> =0。并且必须小于或等于高,即(high – x)<=0。因此,如果乘法结果小于或等于0,则x在范围内。否则没有。感谢eva建议使用此方法。

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

输出:

Yes
No
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”