两个整型数求出两者最大值


原题: 两个整型数,不准用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溢出的问题,想想怎么解决呢?



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值