看博文《一道爱立信改自腾讯笔试题 》所想

本文深入分析并对比了多种不使用条件判断语法来找出两个整数最大值的算法,包括利用数组、整数运算和自定义函数等方法,并指出其局限性和潜在解决方案。

原文地址:http://blog.youkuaiyun.com/hairetz/article/details/4266445


题目是:已知2个整形数据a、b,不使用 if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。首先看看原文作者给出自己的代码,如下:

//code1
void main()
{
    int a=6,b=5;
    int d[2]={b,a},c=(a>b);
    cout<<d[c];
}

我感觉作者用到了大于符号 '>'已经不满足题意了,下面的回复6楼中有人给出了其它办法,代码如下:

//code2
int max(int a,int b)
{
return (a+b+abs(a-b))/2;
}

虽然回帖的很多人觉得这个是正解,但我个人觉得也是不满足题意的,很明显整数绝对值的函数实现是下面这样(glibc实现):

int
abs (int i)
{
  return i < 0 ? -i : i;//这里能够满足要求么?
}

为什么我觉得code2也不行呢,如果调用个code2都能行的话,我随便写个函数比如:

int getMaxNum(int x,int y)
{
	if (x>y)
	{
		return x;
	} 
	else
	{
		return y;
	}
}

int max(int a,int b)
{
	return getMaxNum(a,b);
}

肯定也满足题意要求的,而我用到了 if语句 。我的思路是int数据a、b加减法,其结果无非就是正数、0、负数,数据存储方式不是有符号位么,用这个判断就行了,代码如下:

//code3
#define MASK (1<<31)

int getMaxNum(int a,int b)
{
	int temp=a-b;		
	return temp & MASK;
}

其次,如果a、b差值再边界上,code3也是不完善的,还需要改进!

希望那位朋友有更好的办法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值