C median of values pre-processor macro
我的任务是定义一个宏,以三个数字作为参数并返回它们的中位数。
如果没有长的if语句序列来确定中间元素,我想不出一个简单的方法来实现这一点,因为我也不能使用库函数。
有什么提示吗?
使用条件表达式来缩短时间。这里有一个用于查找两个值的最小值。
1 | #define MIN(x,y) (((x) < (y)) ? (x) : (y)) |
但是,通常不希望有很多嵌套的条件表达式。
注意:当您编写的是宏而不是函数时,如果用户传入(例如
我尝试过这个,它对我很有用:
1 2 3 | #define MAXVAL(val1,val2) ((val1>val2) ? (val1):(val2) ) #define MINVAL(val1,val2) ((val1<val2) ? (val1):(val2) ) #define MEDIAN3(val1,val2,val3) MINVAL(MINVAL(MAXVAL(val1,val2),MAXVAL(val2,val3)),MAXVAL(val3,val1)) |
但是,由于需要对值进行排序以获得中间值,我认为对于3个值,某种简单的气泡排序算法(http://de.wikipedia.org/wiki/bubble sort)应该是最好的解决方案。
--编辑--
这是一个更好的解决方案:
1 | #define MEDIAN3(val1,val2,val3) MAXVAL(MINVAL(MAXVAL(val1,val2),val3),MINVAL(val1,val2)) |
。
最小值为3个宏:
1 | #define MIN3(x,y,z) ( ( y ) <= ( z ) ? ((x) <= (y) ? (x) : (y)) : ((x) <= (z) ? (x) : (z))) |
我有两个宏(或至少找到两个)供您使用:
1 2 | #define MEDIAN(a,b,c) ((a > b) ? (b > c) ? b : (a > c) ? c : a : \ (b > c) ? (a > c) ? a : c : b) |
。
和
1 | #define MEDIAN(a,b,c) ((a-b)*(b-c) > 1 ? b : ((a-b)*(a-c) < -1 ? a : c)) |
。
在那里。它检查了所有六个条件以找到中间值。我做得很快,我相信可以进一步改进。
1 2 | #define MEDIAN(x, y, z) (x <= y ? (z < x ? x : \ (z > y ? y : z)) : (z < y ? y : (z > x ? x : z))) |
号