另解,c/c++有趣的经典笔试题:不用判断语句求得两个整数的最大值

另解,c/c++笔试题:不用判断语句求得两个整数的最大值

                                                                                                                                                                      jiese1990

题目:
There are two int variables: x and y, don’t use “if”, “? :”, “switch”or other judgementstatements, find out the biggest one of the two numbers.
有两个int型的整数:x,y;不使用"if","? :","switch"等判断语句!找出a、b中最大的数!


过两天要去笔试,于是这两天开始看些往年的笔试题;
今天看到已一个比较有趣的笔试题!第一眼看到这个题目就觉得特有意思!于是就拼命的想求解答案!想了那么20来分钟,还是没有想到求解方案,很想很想查看答案,但是,心想,要是自己能独立解出,介个题,那肯定会很爽很爽的...于是乎终于憋出了个答案,兴奋不已啊!

int biger(int x,int y)
{
bool b=x>y; //我想这个应该不算是judgement statements;x>y应该叫做比较表达式吧!而题中也为要求不能使用<,>的比较表达式吧!
return b*x+(!b)*y;
}



看到题目后的几个思路
思路1:不用判断语句,那么可以通过位运算来求的较大者!我们有a=x&y;b=x|y;c=~x;d=~y;
          问题是,我要怎么通过a,b,c,d;和运算符来求得结果;想了半天,未果;于是寻求其它思路。
思路2:有没有什么数学表达式可以直接求得结果!最有可能通过使用x+y,x-y两个式子来求的结果!想了许久,又未果!
思路3:可以通过一个值b来代表x和y那个大,这个数必须要莫是0(代表y更大),要么是1(代表x更大)!然后通过b*x+(!b)*y求的结果!然后很自然的可以想到用一个bool变量!然后就想出了如上答案!

想到答案后,果然很爽很爽...
然后查看答案,本以为答案会是跟我想的一样!事实往往不会是我想当然的那样(我已经习惯了这一点)!
我发现答案更神奇,居然跟我思路2是一路货色(可惜我没有想到啊)!:( ( a + b ) + abs( a - b ) ) / 2;

可是很快我就觉得abs()不能用,我觉得它的实现就是用了判断语句!于是剖开源码:(果不其然)
int __cdecl abs (int number)
{
        return( number>=0 ? number : -number );
}


该方法是变相的使用了"? :";
我想一个数的正负不就是由最高位决定,如果最高位为1,那么就是负数,如果最高位为0,那么就是正数!很明显可以通过这点求绝对值!
但我没心思去想怎么求绝对值了,于是就直接google找到了答案!http://www.wowohi.com/article/html/sort045/sort073/j2se/394.html

这个思路的答案在,该文章中有源码!http://blog.csdn.net/mougaidong/article/details/6904099  

然后我直接google:不用判断语句,获得两个数中的较大者;
找到了很多帖子讨论这个面试题!
找到了很多解决方法,但是没有找到和我想到的答案类似的答案!所以记录下来!

http://www.chinaunix.net/old_jh/23/422544.html
http://www.cnblogs.com/walfud/articles/2176238.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章