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 0010
3对应的二进制为00 0000 0011

1000对应的二进制为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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿源员○

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值