1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 10只小白鼠1000支药水找出毒药问题

10只小白鼠1000支药水找出毒药问题

时间:2022-04-28 18:37:36

相关推荐

10只小白鼠1000支药水找出毒药问题

偶然间看到了这道题:10只小白鼠,1000支药水有且仅有一支是毒药,毒药发作时间是两个小时,忽略小白鼠喝药水的时间以及其他影响因素,每支药水足够多,问:如何利用这10只小白鼠在两个小时内找到那支毒药?

由于我还是个初学者,所以我的第一想法并不是有关计算机语言的知识,而是把这道题当成了一个纯数学题来看待的,10只小鼠与1000支药水匹配,我的第一想法就是随机取数。

把10只小鼠编号为1-10,1000支药水编号为1-1000。从10只小鼠里随机取出1只,有10种取法,取2只有45种,3只有120种,以此类推就是10+45+120+210+252+210+120+45+10+1=1023种取法,再把1000支药水的编号分别与前1000种取法对应,那么哪支编号的药水所喝过的小白鼠全部死亡,哪支就有毒。

后来我试着用计算机语言来做这道题,我发现用二进制的“0”和“1”来代表“存活”与“死亡”,和上述方法不谋而合。

把10只小鼠编号为0-9,1000支药水编号为1-1000,至少有一只小鼠喝了一支药水才会有小鼠死亡,所以先把1000支药水与小鼠的编号对应投喂:

1的二进制是00 0000 0001(10个数对应编号9、8、7、6、5、4、3、2、1、0的小白鼠)

2的二进制是00 0000 0010

。。。

1000的二进制是11 1110 1000

假设编号为1的药水是毒药,那么死亡的只有编号为0的小白鼠;再假设编号为1000的药剂是毒药,那么死亡的一定是编号为3、5、6、7、8、9的小白鼠,那么这样所有问题就迎刃而解了,其实它还能再多出23支药剂,因为1023对应的二进制是11 1111 1111,也就是说10只小白鼠一共可以从1023支药水中一次性找到哪一支是毒药。

#include <stdio.h>#include <math.h>/*10只小白鼠,1000支药水,有且仅有一支是毒药,毒药发作时间是两个小时,忽略小白鼠喝药的时间,每支药水足够多,问:怎样才能在两个小时里找出那支毒药?将10只小白鼠编号为0-9,将1000支药水编号为1-1000而小白鼠死亡则至少喝了一支药水,即1对应的二进制为00 0000 0001 2对应的二进制为00 0000 00103对应的二进制为00 0000 00111000对应的二进制为11 1110 1000*/int main(){int a[10];int i,n;int id=0;printf("小白鼠死亡数:");scanf("%d",&n);printf("死亡小白鼠编号:\n");for(i=0;n--;i++)scanf("%d",&a[i]);for(;i;i--)id+=pow(2,a[i-1]);printf("有毒药剂的编号为:%d",id);}

输入输出样例:

小白鼠死亡数:3

死亡小白鼠编号:

2 5 7

有毒药剂的编号为:164

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。