return 3 个值中间的函数?
Function to return middle of 3 values?
我应该实现一个函数,从输入的三个数字中找出中间的数字。所有输入都是正整数。我似乎没有处理导致我的程序无法通过某些测试的特殊情况,但幅度很小。我的意思是 8 位像素值的标准偏差为 1.46,因此我遗漏的情况应该非常具体,并且介于两者之间的情况很少。
根据我对这个问题的理解,数字有以下三种可能性:
- 他们都是平等的,所以return或者
- 其中两个相等,因此return较小的(较大的也不起作用)
- 都不同,求中间值
我没有看到第四种情况,或者我错过了上述三种情况。我无法使用库进行排序。
int middle(int a, int b, int c)
{
if (a == b && b == c)
{
return c;
}
if ((a < b && b < c) || (c < b && b < a))
{
return b;
}
if ((b < a && a < c) || (c < a && a < c))
{
return a;
}
if ((a < c && c < b) || (b < c && c < a))
{
return c;
}
if (a == b || b == c || a == c)
{
if (a == b && a < c)
{
return c;
}
else
{
return a;
}
if (b == c && b < a)
{
return a;
}
else
{
return b;
}
if (a == c && a < b)
{
return b;
}
else
{
return c;
}
}
return c; // code sometimes reaches this point; it shouldn't
}
这里是这个案例:
if ((b < a && a < c) || (c < a && a < c))
不正确。应该是:
if ((b < a && a < c) || (c < a && a < b))
此外,在
if (a == b || b == c || a == c)
小节,你有
if (...)
return ...
else
return ...
这将始终 return,并忽略其后的 if 语句。
也就是说,如果对 3 个值进行排序会容易得多,然后 return b
if ( b < a ) {
int t = a;
a = b;
b = t;
}
if ( c < b ) {
int t = c;
c = b;
b = t;
}
if ( b < a ) {
int t = a;
a = b;
b = t;
}
return b;
为了在可用时促进简单性,只有三个值要比较,使用单个表达式来确定和return是完全合理的中间值。以下使用嵌套的三元运算符来执行此操作。它使用代码中显示的输入进行测试:
int main(int argc, char *argv[])
{
// int val[] = {7,12,1};
// int val[] = {0,0,1};
int val[] = {-1,-4,-2};
// int val[] = {7,6,2};
// int val[] = {100,99,103};
printf ("middle value is: %d\n", return_middle(val[0], val[1], val[2]));
return 0;
}
int return_middle(int a, int b, int c)
{
return a>b ? ( c>a ? a : (b>c ? b : c)) : (c>b ? b : ( a>c ? a : c));
}
我应该实现一个函数,从输入的三个数字中找出中间的数字。所有输入都是正整数。我似乎没有处理导致我的程序无法通过某些测试的特殊情况,但幅度很小。我的意思是 8 位像素值的标准偏差为 1.46,因此我遗漏的情况应该非常具体,并且介于两者之间的情况很少。
根据我对这个问题的理解,数字有以下三种可能性:
- 他们都是平等的,所以return或者
- 其中两个相等,因此return较小的(较大的也不起作用)
- 都不同,求中间值
我没有看到第四种情况,或者我错过了上述三种情况。我无法使用库进行排序。
int middle(int a, int b, int c)
{
if (a == b && b == c)
{
return c;
}
if ((a < b && b < c) || (c < b && b < a))
{
return b;
}
if ((b < a && a < c) || (c < a && a < c))
{
return a;
}
if ((a < c && c < b) || (b < c && c < a))
{
return c;
}
if (a == b || b == c || a == c)
{
if (a == b && a < c)
{
return c;
}
else
{
return a;
}
if (b == c && b < a)
{
return a;
}
else
{
return b;
}
if (a == c && a < b)
{
return b;
}
else
{
return c;
}
}
return c; // code sometimes reaches this point; it shouldn't
}
这里是这个案例:
if ((b < a && a < c) || (c < a && a < c))
不正确。应该是:
if ((b < a && a < c) || (c < a && a < b))
此外,在
if (a == b || b == c || a == c)
小节,你有
if (...)
return ...
else
return ...
这将始终 return,并忽略其后的 if 语句。
也就是说,如果对 3 个值进行排序会容易得多,然后 return b
if ( b < a ) {
int t = a;
a = b;
b = t;
}
if ( c < b ) {
int t = c;
c = b;
b = t;
}
if ( b < a ) {
int t = a;
a = b;
b = t;
}
return b;
为了在可用时促进简单性,只有三个值要比较,使用单个表达式来确定和return是完全合理的中间值。以下使用嵌套的三元运算符来执行此操作。它使用代码中显示的输入进行测试:
int main(int argc, char *argv[])
{
// int val[] = {7,12,1};
// int val[] = {0,0,1};
int val[] = {-1,-4,-2};
// int val[] = {7,6,2};
// int val[] = {100,99,103};
printf ("middle value is: %d\n", return_middle(val[0], val[1], val[2]));
return 0;
}
int return_middle(int a, int b, int c)
{
return a>b ? ( c>a ? a : (b>c ? b : c)) : (c>b ? b : ( a>c ? a : c));
}