在没有条件IF语句的情况下查找数字的最大值c ++

时间:2013-04-05 04:26:17

标签: 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, 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这样的数字。但是在彼此之间有两个以上空格的数字,不是4,8或5,7。任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

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

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

重写1:如果a> b,返回;否则,返回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

编辑:即使a-b溢出,此代码也能正常工作。 令k等于a-b的符号,使得如果a-b> = 0,则k为1,否则k = 0.Let q为k的倒数。当a为正数或b为负数时,上面的代码溢出,或者相反。如果a和b有不同的符号,那么我们希望k等于符号(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;
}

答案 1 :(得分:1)

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

int max_num = (x>y)*x + (y>=x)*y;

答案 2 :(得分: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);

答案 3 :(得分:0)

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

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

这是基于@ {9}}的解决方案,@ user93353在上面的评论中指出。

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