如何用10隻實驗鼠檢驗出1000個藥瓶中哪個有毒藥?
轉自:https://blog.csdn.net/u012027907/article/details/12296473
當我第一次看到這個麵試題的時候,也不知道從何處下手,但在別人的提示下,我才明白了!
如果你看到這個題目,能夠立即想到2 的 10 次方 = 1024.那你已經知道答案了!
原題的描述是:給你10隻實驗小鼠,用7天的時間檢驗1000個瓶子中帶有一瓶毒藥的瓶子是哪一瓶,小鼠喝了毒藥7天後才會死亡,如何編程實現?
這是二進製數的一個應用,如果你不明白白,請看下麵簡單點的。
用3隻來檢驗8瓶。
小鼠最後的狀態隻有兩種,即:死亡(喝了毒藥)和活著(沒有喝毒藥)。
我們用0 - 7 來給8個瓶子編號,並用二進製表示:
000 第0瓶
001 第1瓶
010 第2瓶
011 第3瓶
100 第4瓶
101 第5瓶
110 第6瓶
111 第7瓶
我們讓第一隻小鼠(紅色表示)喝第4、5、6、7瓶,讓第二隻小鼠(藍色表示)喝第2、3、6、7瓶,讓第三隻小鼠喝第1、3、5、7瓶,這樣小鼠7天後就隻有這八種狀態,如果是 第一隻活(0),第二隻活(0),第三隻死(1),那就可以確定是第一瓶,其他的也如此。
2的3次方 = 8 ,2的10次方 = 1024,所以用10隻小鼠可以檢驗1000個瓶子的。
小鼠的狀態可用0(活)、1(死)表示,也就可以用計算機實現。
其實就是進製轉換的問題:將二進製轉為十進製。
最後輸入小鼠的狀態,如0000000000,轉為十進製 0,則第0瓶有毒。
進製轉換代碼如下:
- public class Base {
- /**
- * 將數轉為任意進製
- * @param num
- * @param base
- * @return
- */
- public String baseString(int num,int base){
- if(base > 16){
- throw new RuntimeException("進製數超出範圍,base<=16");
- }
- StringBuffer str = new StringBuffer("");
- String digths = "0123456789ABCDEF";
- Stack<Character> s = new Stack<Character>();
- while(num != 0){
- s.push(digths.charAt(num%base));
- num/=base;
- }
- while(!s.isEmpty()){
- str.append(s.pop());
- }
- return str.toString();
- }
- /**
- * 16進製內任意進製轉換
- * @param num
- * @param srcBase
- * @param destBase
- * @return
- */
- public String baseNum(String num,int srcBase,int destBase){
- if(srcBase == destBase){
- return num;
- }
- String digths = "0123456789ABCDEF";
- char[] chars = num.toCharArray();
- int len = chars.length;
- if(destBase != 10){//目標進製不是十進製 先轉化為十進製
- num = baseNum(num,srcBase,10);
- }else{
- int n = 0;
- for(int i = len - 1; i >=0; i--){
- n+=digths.indexOf(chars[i])*Math.pow(srcBase, len - i - 1);
- }
- return n + "";
- }
- return baseString(Integer.valueOf(num),destBase);
- }
- }
最後更新:2017-04-03 15:22:13