原题: 两个整型数,不准用if 、switch 、?:等判断语句求出两者最大值,说出你的思路,能写出代码更好
乍看此题不难,细想……怎么搞。见到个使用这个方法的:
int a = 3;
int b = 4;
((a + b) + abs(a - b))/2;
((a + b) + abs(a - b))/2
这个方法很不错啊,能想到这样实现的人的脑袋应该是至少两个“+”号,但依据题的本意应该是不让使用判断。那么转而有个情况:
那abs函数是如何实现的呢?abs函数里也是用的判断然后返回的正值。
诸如:
while(a < b)
return b;
return a;
均变相使用了判断。
下面写出个人的实现,手写,未经程序验证,不足之处请指正:
#define int_len (sizeof(int)<<3 - 1)
//以下描述假设int为32位
int a = 1;
int b = 2;
int c = a - b;
unsigned int d = ~0;//,即最大的无符号数,此句得到一个32位数全1的数
int max;
c = c>>int_len;//此句得到c的符号位,0或1
d += c;//这里应该比较清楚了,如果c为0则d依然全1,若c为1则d溢出为全0
max = a&d + b&d;//好像格式这么写的,这里应该可以看懂吧。
遇到个方法更简便的:
int a = 1;
int b = 2;
int ab[2] = {a, b};
c = (a-b)>>31;
max = ab[c];
但以上方法均存在一个a-b溢出的问题,想想怎么解决呢?