面试一个题 .

http://blog.csdn.net/back_to_dream/article/details/6552506

今天的趣题来源于 IBM Ponder This 三月份的谜题。

    大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

    这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ……每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

    现在,有意思的问题来了:如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

    答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 37 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ……也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

    类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来。


有一袋子白沙,一袋子黑沙,各100克。

从白沙袋子中取5克,扔到黑沙袋子里,搅一搅(不是均匀搅拌)

然后再从黑沙中取5g,放回到白沙袋子中。 

问:黑沙袋子中白沙含量高?还是白沙袋子中黑沙含量高?

答曰:等

(面试的一个题,回来想了想,应该是一样的吧

 初始:黑袋子 100g 白 100g

 结果:黑袋子  100g:100 *p 白沙       100*(1-p)黑沙

          白袋子   100g:100*p1 黑沙      100*(1-p1)白沙

p+1-p1=1-P+p1

导出:p=p1

其实不用算,想想开始状态和结果状态,相当于部分黑沙和白沙交换,这个量是一样啊

 

renren笔的一个题,记一下

编写一个函数比较两个整数大小,但不能使用任何比较操作符

form  Linuxsir

注意正数和负数相减时可能溢出 这时只需将符号位相减 用if语句判断即可。

[cpp] view plain copy print ?
  1. int comp_int(int var1, int var2)  
  2. /* return value < 0: means var1 < var2;  
  3.  *              = 0: means var1 = var2; 
  4.  *              > 0: means var1 > var2; 
  5. */  
  6. {  
  7.     int bit_width, msb, rtnvar;  
  8.     bit_width = sizeof(int) << 3;      
  9.     msb = var2 >> (bit_width -1) -   
  10.           var1 >> (bit_width -1);  
  11.     if (msb)  
  12.         rtnvar = msb;  
  13.     else  
  14.         rtnvar = var1 - var2;  
  15.     return rtnvar;  
  16. }  

 int comp_int(int var1, int var2) /* return value < 0: means var1 < var2; * = 0: means var1 = var2; * > 0: means var1 > var2; */ { int bit_width, msb, rtnvar; bit_width = sizeof(int) << 3; msb = var2 >> (bit_width -1) - var1 >> (bit_width -1); if (msb) rtnvar = msb; else rtnvar = var1 - var2; return rtnvar; }

[cpp] view plain copy print ?
  1. #include  <stdio.h>   
  2. #include  <stdlib.h>   
  3.   
  4. int main(int argc,char *argv[])  
  5. {  
  6.      int num1,num2;  
  7.     int i = 0;  
  8.     int tok =0;  
  9.     char result[3][32];  
  10.     if(argc != 3)  
  11.     {  
  12.           printf("Usage: cmp_int num1 num2/n");  
  13.           exit(1);  
  14.     }  
  15.     num1 = atoi(argv[1]);  
  16.     num2 = atoi(argv[2]);  
  17.     sprintf(result[0],"%d = %d",num1,num2);  
  18.     sprintf(result[1],"%d > %d",num1,num2);  
  19.     sprintf(result[2],"%d < %d",num1,num2);  
  20.     printf("The lagest int number is %d/n",~(1 << (sizeof(int) * 8 - 1)));  
  21.     printf("The lest int number is %d/n",1 << (sizeof(int) * 8 - 1));  
  22.     tok = (num1 >> 31) ^ (num2 >> 31); // = 0 if they have the same tok, else =-1;  
  23.     i = (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok) + ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));  
  24.     printf("Result: %s/n",result[-i]);  
  25.     return 0;  
  26. }  

 

你可能感兴趣的:(面试一个题 .)