C ++如何获得最大和最小的

时间:2013-05-24 21:17:37

标签: c++ if-statement

这是一个简单的介绍课程问题,它要求编写一个程序,要求用户输入3个数字,并确定最大和最小的数字。 仅使用if语句。我认为它写的是这样的,但是否可以只使用3次或更少的比较?我认为y > largest时,它还告诉我们其他的东西?

这是我到目前为止所做的:需要进行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;

7 个答案:

答案 0 :(得分: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个比较。

答案 1 :(得分:1)

为什么要查看if (y < smallest)?在此流程中,smallest必须为x,但您已在第一个条件(y > x)中检查过if (y > largest),因此第三个条件是多余的

答案 2 :(得分:1)

问题是只在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.

答案 3 :(得分:0)

通常,您可以使用最多3次比较来确定三个数字xyz的排序:

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个数的最小值。

答案 4 :(得分: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;
}

答案 5 :(得分: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次比较。

答案 6 :(得分:0)

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"; }