另解,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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章