1.有888瓶编了号码的水及10只健康的小白鼠,其中一瓶水有毒,小白鼠饮用毒水一天后会死,最少需要几天可以找到哪瓶水有毒?

思路就是用二进制,2^10=1024,也就是10只小白鼠最多能验出1024瓶药水,哪个有毒。小白鼠编号,1-10。瓶子也编号,1-1000,然后把瓶子的编号转变为二进制数。如果第几位是1,就把这瓶水给第几个小白鼠喝。最后大概每个小白鼠喝500瓶药水的混合液。如果还不懂,下面列几个数字解释一下。

瓶子编号 二进制数 第几个小白鼠喝

1 0000000001 1

2 0000000010 2

3 0000000011 1,2

4 0000000100 3

5 0000000101 1,3

大概就是这意思,再反过来,假如1号和3号小白鼠死了,死的小白鼠用1表示,再写成2进制数:0000000101,转化为十进制数是5,从上面列出来的也可以看出1,3都喝了5号瓶的水,所以就是第五瓶水有毒。

python代码:

#coding=utf-8
#十个列表,每个小白鼠一个
a=[]
b=[]
c=[]
d=[]
e=[]
f=[]
g=[]
h=[]
i=[]
j=[]

#888瓶水标签0-889
li=list(range(1,889))
#取出一瓶水,把标签十进制数字转化为二进制
for x in li:
# 定义一个空列表,存储每次二进制数,存进列表里的二进制数是字符格式的
li1 = []
er=bin(x)
# print (er)
for y in er:
if yb:
continue
else:
li1.append(y)
#把li1列表里的元素顺序反向排列
list.reverse(li1)
# print (li1)
#计算li1列表里元素个数,根据元素个数生成一个列表,每次从li1里拿元素用
n=list(range(len(li1)))
# print (n)
for y in n:
# print (y)
# print (li1[y])
# print (x)
# print (type(li1[y]))
#li1这个二进制列表里拿一个数,这个数为1的时候,就是把原十进制数对应水编号给y小白鼠喝
if li1[y]
‘1’:
# print (x)
# print (type(y))
# print (y)
if y0:
# print (y)
a.append(x)
elif y
1:
# print (y)
b.append(x)
elif y2:
c.append(x)
elif y
3:
d.append(x)
elif y4:
e.append(x)
elif y
5:
f.append(x)
elif y6:
g.append(x)
elif y
7:
h.append(x)
elif y==8:
i.append(x)
else:
j.append(x)
# else:
# continue
print (“1000瓶水打上标签,经过下面计算,每只小白鼠喝下下面计算的混合液。”)
print (“第一只小白鼠喝下水瓶标签:”,a)
print (“第二只小白鼠喝下水瓶标签:”,b)
print (“第三只小白鼠喝下水瓶标签:”,c)
print (“第四只小白鼠喝下水瓶标签:”,d)
print (“第五只小白鼠喝下水瓶标签:”,e)
print (“第六只小白鼠喝下水瓶标签:”,f)
print (“第七只小白鼠喝下水瓶标签:”,g)
print (“第八只小白鼠喝下水瓶标签:”,h)
print (“第九只小白鼠喝下水瓶标签:”,i)
print (“第十只小白鼠喝下水瓶标签:”,j)
print (“如果第一只,第三只,第五只小白鼠死了,就是0b0000010101(二进制数,转化为十进制数是21),第21瓶水有毒。”)
888瓶水太多了,简化为4只小白鼠,验15瓶药水。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值