Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找无条件IF语句c+的最大数+;_C++_If Statement - Fatal编程技术网

C++ 查找无条件IF语句c+的最大数+;

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

因此,我也从用户输入中获取了两个数字,并在不使用if语句的情况下找到这两个数字的最大值

这门课是一门初级课,我们也必须使用我们已经知道的东西。我算出来了,但只有先输入最大值才行

#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)
so
max=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;