5

这是一个简单的介绍课程问题。我必须编写一个程序,要求用户输入 3 个数字,并确定最大和最小的数字。

我只需要使用if语句。

这是我到目前为止所尝试的:需要进行 4 次比较。

int x, y, z;
int smallest, largest; 
cout << "Please enter 3 numbers to compare: " ;
cin >> x >> y >> z;

smallest = x;
largest = x;

if (y > largest) 
        largest = y;
if (z > largest)
        largest = z;
if (y < smallest)
        smallest = y;
if (z < smallest)
        smallest = z;

cout << "largest: " << largest << ", and smallest: " << smallest << endl;   

我的问题是:是否可以只使用 3 个比较或更少?我想什么时候y > largest,它也告诉我们其他的东西?

4

7 回答 7

10

你的代码的问题是你扔掉了很多信息。在诸如此类的“挑战”中,你必须充分利用你所拥有的。所以当你说,例如

if (y > largest) 

不要只处理true案件。当条件不成立时,还要尝试对情况进行推理。

if ( x < y )
{
    smallest = x;
    biggest = y;
}
else
{
    smallest = y;
    biggest = x;
}

if ( z < smallest )
   smallest = z;
else if ( z > biggest )
   biggest = z;

这仅包含 3 个比较。

于 2013-05-24T21:23:18.703 回答
1

你为什么要检查if (y < smallest)?在流程中的这一点上,smallest必须是x,但您已经检查了是否y > x在第一个条件 ( if (y > largest)) 中,因此第三个条件是多余的。

于 2013-05-24T21:22:35.237 回答
1

问题是仅通过 if else 语句找到最大或最小,我们要使用三个变量,所以我们只需要两个比较。

{
    int valueOne,
    valueTwo,
    valueThree,
    smallest;

//User input for valueOne, valueTwo, valueThree.

smallest = valueOne;

if (smallest < valueTwo)
{
smallest = valueTwo;
}
if (smallest < valueThree)
{
smallest = valueThree;
}

//No matter what happens, smallest will have the smallest value now.

//Use >, rather than <, and "largest" rather than "smallest" for finding largest value.

//With this logic, you always will have one less comparison than the total number or variables to compare

//i.e. 7 variables means 6 comparisons.

//This contains only 2 comparisons.
于 2015-03-18T05:52:28.157 回答
0

一般来说,您最多可以使用 3 个比较来确定三个数字xy和的排序:z

if (x < y)
    if (y < z)
       //x,y,z -> x min
    else if (x < z)
       //x,z,y -> x min
    else
       //z,x,y -> z min
else
    if (z >= x)
       //y,x,z -> y min
    else if (z >= y)
       //y,z,x -> y min
    else
       //z,y,x -> z min

所以获得最小值也可以通过 3 次比较来完成。


您可以通过执行以下操作获得 2 次比较中的最小值:

m = x;
m = min(m,y);
m = min(m,z);

min(a,b)在哪里a < b ? a : b


一般来说,您可以使用 N - 1 个比较来获得 N 个数字中的最小值。

于 2013-05-24T21:22:18.040 回答
0

这只是为了好玩,我相信该myabs功能实际上应该是未定义的行为,但我只见过它按预期工作的地方。

    double myabs(double x)
    {
        int64_t * p = (int64_t*)&x;
        //clear sign bit
        *p &= 0x7fffffffffffffff;
        return x;
    }

    int main()
    {
        double x = 0, y = 1, z = 2;
        //find max/min of first two numbers
        double min = (myabs(x+y)-myabs(x-y))/2;
        double max = (myabs(x+y)+myabs(x-y))/2;
        //find max/min of previous max/min and third number
        min = (myabs(min+z) - myabs(min-z))/2;
        max = (myabs(max+z) + myabs(max-z))/2;
        std::cout << min << ' ' << max << std::endl;
        return 0;
    }

0 2总共 0 次比较正确输出。

于 2013-05-24T21:41:50.220 回答
0

我觉得这对你来说最容易理解。

a = 5;
b = 10;
c = 15;

//FIND MAX
if (a >= b && a >= c)
{
   max = a;

} else
{
    if (b >= c)
        max = b
    else
        max = c;
}

//FIND MIN
if (a <= b && a <= c)
{

    min = a;
} else
{
    if (b <=c)
        min = b;
    else
        min = c;
}
于 2013-05-24T21:40:50.873 回答
-1
int a; int b; int c;
cin >> a >> b >> c;

if ( a > b && b > c ){ cout << a << " MAIXM \n" << b << " MEDIU \n" << c << " MINIM \n"; }

if ( b > a && a > c ){ cout << b << " MAIXM \n" << a << " MEDIU \n" << c << " MINIM \n"; }

if ( c > b && b > a ){ cout << c << " MAIXM \n" << b << " MEDIU \n" << a << " MINIM \n"; }

if ( a > c && c > b ){ cout << a << " MAIXM \n" << c << " MEDIU \n" << b << " MINIM \n"; }

if ( b > c && c > a ){ cout << b << " MAIXM \n" << c << " MEDIU \n" << a << " MINIM \n"; }

if ( c > a && a > b ){ cout << c << " MAIXM \n" << a << " MEDIU \n" << b << " MINIM \n"; }
于 2019-01-30T10:35:20.280 回答