另解,c/c++筆試題:不用判斷語句求得兩個整數的最大值
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 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