在一家工程初创公司的面试中,我被问到这个问题:
计算机能够执行 4 种基本数学运算(加、减、乘、除)和 Max() 运算,返回两个接收到的参数中的较大者。编写一个程序,接收三个数字并返回三个数字中间的那个。您不得使用条件句 (if)。
示例输入和预期输出:
mid(1, 5, 2) 应该返回结果 2.
没有指定编程语言。
我设计了以下程序并用C(我唯一比较了解的语言......)编写了它:
int x,y,z,q1,q2,q3;
printf("Type 3 numbers: \n");
scanf("%d %d %d", &x, &y, &z);
q1=max(x,y);
q2=max(x,z);
q3=max(y,z);
int mid(int q1, int q2, int q3)
{
while (q2<q3)
{
while (q1<q2)
{
return q2;
}
while (q2<q1)
{
return q1;
}
while (q1<q2)
{
while (q3<q2)
{
while(q1<q3)
{
return q3;
}
return q1;
}
return q2;
}
int nummid=mid(x,y,z);
nummid
a + b - Max(a, b)
给出 a
和 b
的最小值(忽略溢出)。称之为Min(a, b)
.
设
Max3(a, b, c)
为Max(Max(a, b), c)
,即a
、b
和c
中的最大值。
让
Min3(a, b, c)
成为Min(Min(a, b), c)
.
那么
a
、b
、c
的中间是a + b + c - Max3(a, b, c) - Min3(a, b, c)
.
假设可以使用NO条件(并且MAX是内置操作,这意味着下面的MAX宏不算):
#define MAX(a, b) ((a) < (b) ? (b) : (a))
#define MIN(a, b) ((a) + (b) - MAX((a), (b)))
int mid(int i, int j, int k)
{
int x;
x = i + j + k;
x -= MIN(MIN(i, j), k);
x -= MAX(MAX(i, j), k);
return x;
}