这是一个简单的介绍课程问题,它要求编写一个程序,要求用户输入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;
答案 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次比较来确定三个数字x
,y
和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个数的最小值。
答案 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"; }