这是简单但有趣的编程难题。给定三个整数,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