二進制的妙用

好久以前就聽到的這個面試題,如今一直記憶猶新。html

有個店主有1000個蘋果,有10個框。一會要來一個特殊的顧客,他說出一個須要的蘋果數,而後店主不須要從新裝蘋果,只須要將特定的幾個框給顧客便可知足他要的蘋果數。問,店主事先應該如何將1000個蘋果放到10個框裏才能知足顧客提出的一次要求?(固然顧客說的蘋果數是0到1000之間)程序員

 

分析上面這個狀況,也就是要構造10個數,當從10個數中取出特定的數時,其和可以表示1,1000之間的全部數。面試

初看這題會以爲難以想象,用10個數就能夠表示[1,1000]之間的全部數!!spa

從最小的數開始一步步分析,要表示1,確定得有1吧。這時有一個數1.htm

要表示2,能夠再添加一個1,也能夠添加一個2.若是添加1的話,那麼表示3時又要添加一個1,因此咱們選擇添加2。這裏有1,2blog

表示3的話,用1,2便可。get

表示4,能夠再添加一個1,或者添加4。若是添加1,那麼表示5時,又得添加一個1,因此直接添加4。這時有1,2,4二進制

身爲程序員的咱們這裏就能夠看到規律了1,2,4,8,16,32....程序

因此,應該是這樣放蘋果1,2,4,8,16,32,64,128,256,489。最後一個框沒有512個蘋果了,因而將因此剩下的都放其中。思考

 

思考這個答案的本質:

任意整數都對其對應的二進制,好比13對應(1101)2,因此能夠寫成(1000)2+(100)2+(1)2

而二進制的1對應整數1,二進制的10對應2,(100)2對應4,(1000)2對應8,因此用1,2,4,8,16,...這樣的數能夠表示全部從1到其和之間的任意整數。

BigNumber實現小數次冪,http://www.cnblogs.com/xiangism/p/4614674.html這片文章中有介紹小數二進制的一個妙用。

 

回想初中時,有一次考試是用2B鉛筆在答題卡上填答案,而且學號也要用2B鉛筆塗出來。如今清晰地記得當時就是要咱們在1,2,4,8這四個數中塗上對應的數來表示數字。當時我就很是驚訝爲何這四個數就能夠表示全部1到10之間的數,是怎麼想出來的????  成了程序員後最終於明白了這裏的玄機……

相關文章
相關標籤/搜索