您的位置:首页 > 其它

几个有趣的小题

2012-03-29 17:04 176 查看
1、南大的一道面试题:用4个0,经过各种运算后得出24

看到题时第一感觉就蒙了,因为用通常的加减乘除无论怎么算结果都是0,所以就要拓展思维,跳出常规思路

(1) ( 0!+0!+0!+0!)! 用阶乘把0变为1,接着运算

(2) (cos0+cos0+cos0+cos0)! 通过上一种方法的启示,用0变为1,当然类似的还有

(3) (exp(0)+exp(0)+exp(0)+exp(0))!

(4) (cosh(0)+cosh(0)+cosh(0)+cosh(0))! // cosh(x)=(exp(x)+exp(-x))/2.0

(5) (sech(0)+sech(0)+sech(0)+sech(0))! //sech(x)=1/cosh(x)

一个更有想象力的方法是

(6)00:00 时间24点

当然上边那是由0!引申出来的,那能不能用上具有编程语言特色的呢,答案是肯定的

(7) '0'/(('0'+'0')/'0') //'0'的ascii码为48,等价于48/((48+48)/48) 感觉这种方法才是最牛X的

2、有1000个一模一样的瓶子,其中有999瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药

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

或者可以这样理解:把瓶子编号0-999,对于每一个瓶子转换成十位二进制,比如编号为127的瓶子为0001111111。给位数为1的小白鼠喝,也就是第4 5 6 7 8 9 10个小白鼠喝。这样如果哪几只小白鼠挂掉了,把对应位置1,根据二进制转换为十进制。这个编号的瓶子就是有毒的

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

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

总结:n只小白鼠t周的时间可以从至多(t+1)^n个瓶子中检验出毒药(一瓶)来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: