基于Max()函数且无分支语句的三数取中算法实现问询
无条件语句的三数中位数实现方案(仅用四则运算与Max())
问题回顾
给定一台仅支持加减乘除四则运算和返回两数较大值的
Max()函数的计算机,编写一个接收三个数字并返回其中位数的程序,要求不得使用if等条件语句。示例:mid(1, 5, 2)应返回2。
你的代码问题分析
你提交的尝试代码存在多处问题:
- C语言不允许在函数内部嵌套定义另一个函数,
mid()的定义位置错误 - 嵌套的
while循环本质还是依赖条件判断,违反了题目“禁用条件语句”的要求 - 代码存在未闭合的代码块、无意义的语句,逻辑混乱无法正常运行
正确实现思路与代码
核心思路是利用中位数的数学特性,通过Max()和四则运算推导最小值(Min(a,b) = a + b - Max(a,b)),再组合出中位数的计算逻辑,全程无需任何条件判断。
实现方式1:通过推导Min函数实现
// 基于Max推导Min函数,无任何条件判断 int Min(int a, int b) { return a + b - Max(a, b); } // 计算三数中位数 int mid(int x, int y, int z) { int max_xy = Max(x, y); int min_xy = Min(x, y); // 先取x和y的最大值与z的最小值,再和x与y的最小值取最大值,得到中位数 return Max(min_xy, Min(max_xy, z)); }
实现方式2:完全展开为纯Max与四则运算(无需额外Min函数)
如果不想单独定义Min函数,可以直接将逻辑展开:
int mid(int x, int y, int z) { return Max( x + y - Max(x, y), Max(x, y) + z - Max(Max(x, y), z) ); }
实现方式3:通过总和减最大最小值实现
中位数也等于三个数的总和减去最大值与最小值,同样可以用Max推导最小值:
int mid(int x, int y, int z) { int total = x + y + z; int max_val = Max(x, Max(y, z)); // 推导三数中的最小值 int min_xy = x + y - Max(x, y); int min_val = min_xy + z - Max(min_xy, z); return total - max_val - min_val; }
验证示例
以mid(1, 5, 2)为例:
- 方式1:
Max(1,5)=5,Min(1,5)=1;Min(5,2)=2;Max(1,2)=2,返回结果正确 - 方式3:总和为8,最大值为5,最小值为1;
8-5-1=2,返回结果正确
内容的提问来源于stack exchange,提问作者Stephbak
相关产品推荐
相关产品推荐

