1

所以我也从用户输入中得到两个数字,并在不使用 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;
}

到目前为止,这就是我所拥有的,但是在放入不同的测试数据后,我发现它仅适用于 4,5 或 6,7 等数字。但是彼此之间有超过 2 个空格的数字,例如 4,8 或 5, 7。任何帮助将不胜感激。

4

4 回答 4

2

我在 Cracking the Coding 面试书中看到了这个问题。

让我们尝试通过“重新措辞”这个问题来解决这个问题 我们将重新措辞这个问题,直到我们得到一些删除所有 if 语句的东西

改写1:如果a > b,返回a;否则,返回 b
改写 2:如果 (a - b) 为负数,则返回 b;否则,返回一个
重新措辞 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;
}

来源:http ://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/098478280X

编辑:即使 ab 溢出,此代码也有效。令 k 等于 ab 的符号,如果 ab >=0,则 k 为 1,否则 k=0。令 q 为 k 的倒数。当 a 为正数或 b 为负数时,上面的代码会溢出,反之亦然。如果 a 和 b 有不同的符号,那么我们希望 k 等于 sign(a)。

/* 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;
}
于 2013-04-05T04:44:50.797 回答
1

这是一个有趣的解决方案:

int max_num = (x>y)*x + (y>=x)*y;
于 2013-04-05T05:18:21.127 回答
0

您可以尝试使用此代码来查找maxmin两个输入变量。

((a > b) && (max = a)) || (max=b);
((a < b) && (min = a)) ||  (min=b);

对于三个输入变量,您可以使用类似的方法,如下所示:

int main()
{
    int a = 10, b = 9 , c = 8;
    cin >> a >> b >> c;
    int max  = a, min = a;
    // For Max
    ((a > b) && (a > c) && (max=a)) || 
           ((b > c) && (b > a) && (max=b)) || 
           (max=c) ;

    // For min
    ((a < b) && (a < c) && (min=a)) || 
         ((b < c) && (b < a) && (min=b)) || 
         (min=c) ;

    cout << "max = " << max;
    cout << "and min = " << min;
    return 1;
}

一次运行是:

:~$ ./a.out 
1
2
3
max = 3 and min = 1

编辑

感谢@Tony D:此代码将因负数而失败。

可以尝试对两个输入的负数进行此操作以找到最大值(不确定):

((a > b) && ( a > 0 && (max = a))) ||  ((b > a) && (max = b)) || (max = a);
于 2013-04-05T04:37:13.413 回答
0

假设您已经涵盖了按位运算符,您可以这样做:

max = a-((a-b)&((a-b)>>(sizeof(int)*8-1)));

这是基于@user93353 在上面的评论中指出的在数学上找到没有条件比较的最大值的解决方案。

如果你真的只是想避免 if 语句,而不是一般的比较,这可能是矫枉过正。

于 2013-04-05T04:53:49.003 回答