C++ 查找无条件IF语句c+的最大数+;
因此,我也从用户输入中获取了两个数字,并在不使用if语句的情况下找到这两个数字的最大值 这门课是一门初级课,我们也必须使用我们已经知道的东西。我算出来了,但只有先输入最大值才行C++ 查找无条件IF语句c+的最大数+;,c++,if-statement,C++,If Statement,因此,我也从用户输入中获取了两个数字,并在不使用if语句的情况下找到这两个数字的最大值 这门课是一门初级课,我们也必须使用我们已经知道的东西。我算出来了,但只有先输入最大值才行 #include <iostream> using namespace std; int main() { int x = 0, y = 0, max = 0; int smallest, largest; cout << "Please enter 2 integer numbers, a
#include <iostream>
using namespace std;
int main()
{
int x = 0, y = 0, max = 0;
int smallest, largest;
cout << "Please enter 2 integer numbers, and i will show you which one is larger: ";
cin >> x >> y;
smallest = (x < y == 1) + (x - 1);
smallest = (y < x == 1) + (y - 1);
largest = (x < y == 1) + (y - 1);
largest = (y > x == 1) + (x + 1 - 1);
cout << "Smallest: " << smallest << endl;
cout << "Largest: " << largest << endl;
return 0;
}
#包括
使用名称空间std;
int main()
{
int x=0,y=0,max=0;
int最小,最大;
cout>x>>y;
最小值=(xx==1)+(x+1-1);
cout您可以尝试使用此代码查找两个输入变量的max
和min
((a > b) && (max = a)) || (max=b);
((a < b) && (min = a)) || (min=b);
编辑
多亏了@Tony D:这个代码对于负数将失败
可以对两个输入的负数进行此操作,以找到最大值(对此不确定):
我在破解编码面试书时看到了这个问题
让我们试着通过“重新措辞”问题来解决这个问题,我们将重新措辞这个问题,直到我们得到删除所有if语句的东西
重写1:如果a>b,则返回a;否则,则返回b
重写2:如果(a-b)为负数,则返回b;否则,则返回a
重写3:如果(a-b)是负数,让k=1;否则,让k=0返回a-k*(a-b)
重写4:让c=a-b,让k=c的最高有效位返回a-k*c
int getMax(int a, int b) {
int c = a - b;
int k = (c >> ((sizeof(int) * CHAR_BIT) - 1)) & 0x1;
int max = a - k * c;
return max;
}
资料来源:
编辑:此代码即使在a-b溢出时也有效。
设k等于a-b的符号,如果a-b>=0,则k为1,否则k=0。设q为k的倒数。当a为正或b为负时,或反过来,上述代码溢出。如果a和b具有不同的符号,则我们希望k等于符号(a)
假设您已经介绍了位运算符,则可以执行以下操作:
max = a-((a-b)&((a-b)>>(sizeof(int)*8-1)));
这是基于@user93353在上述评论中指出的解决方案
如果您真的只是试图避免if语句,而不是一般的比较,那么这可能会有点过头了。这里有一个有趣的解决方案:
int max_num = (x>y)*x + (y>=x)*y;
当然不是。最大=(y>x==1)+(x+1-1);
只要返回x+1
如果y>x
(例如y=9,x=8,这将返回9,但不是因为9更大)您将两次分配给同一事物,而忽略第一次。您是否涵盖了if语句?为什么不包括if语句?是否允许使用std::max
?尝试一下:int max=(x>y?x:y);
-1“您可以使用此代码查找max((a>b)和&(max=a))|(max=b)<代码> A==0 和<代码> B= -1 < <代码>:<代码> A> B> <代码>是代码>真< /代码>,所以<代码> max = A < /代码>被评估,但产生<代码> false <代码> ->整个表达式是“代码>(false)”(max=B)
somax=b
也会运行,给出结果-1
@TonyD好的,我没有尝试负数Tony。是的,你是对的。我会尝试用正确的解决方案进行更新。如果你想改进我的答案,我会非常高兴:)@TonyD你能检查编辑部分我对max正确吗?哦,是的……这太复杂了,伤害了我我开始看它——当代码不明显是正确的时,这是令人担忧的。为了测试,我将您的代码放入char mymax(char a,char b)
,然后for(int ia=-128;我不该说Grijesh,我很高兴您可以做任何您喜欢的事情。我认为这种方法有潜力(您的第一个版本适用于许多(所有?)人)(正值),人们看到我上次测试的暴力方式有潜在的价值,即检查签名类型允许的a和b输入的每个组合(使用char
,因为8位在时间上是可管理的,并且说明了int
的问题,在char
和int
之间仔细转换以使测试工作正常)。对于较小的数字使用很好,但对于某些边缘情况,这是无效的-其中a-b
将是
。您假设整数包含32位。为什么不使用(sizeof(int)*CHAR u位)-1
?是的,您是对的。感谢您指出它!我认为您的意思是&(逻辑)不是&(按位),因为在后一种情况下,如果b>a,它将返回a-a-b=b,因为设置了最高位。但是如果a>b,它将返回a-((a-b)&0x00),这将导致仅当b==0时返回“a”,在某些其他情况下可能会返回“a”。它肯定是按位and(&)例如:a=5,b=4,max=5;a=1,b=200,max=200;a=0,b=-1,max=0;a=-200,b=-300,max=-200;你是对的,我的大脑有点扭曲。
int getMax(int a, int b) {
int c = a - b;
int k = (c >> ((sizeof(int) * CHAR_BIT) - 1)) & 0x1;
int max = a - k * c;
return max;
}
/* Flips 1 to 0 and vice-versa */
public static int flip(int bit){
return 1^bit;
}
/* returns 1 if a is positive, and 0 if a is negative */
public static int sign(int a){
return flip((a >> ((sizeof(int) * CHAR_BIT) - 1)) & 0x1);
}
public static int getMax(int a, int b){
int c = a - b;
int sa = sign(a-b); // if a>=0, then 1 else 0
int sb = sign(a-b); // if b>=1, then 1 else 0
int sc = sign(c); // depends on whether or not a-b overflows
/* If a and b have different signs, then k = sign(a) */
int use_sign_of_a = sa ^ sb;
/* If a and b have the same sign, then k = sign(a - b) */
int use_sign_of_c = flip(sa ^ sb);
int k = use_sign_of_a * sa + use_sign_of_c * sc;
int q = flip(k); //opposite of k
return a * k + b * q;
}
max = a-((a-b)&((a-b)>>(sizeof(int)*8-1)));
int max_num = (x>y)*x + (y>=x)*y;