思路就是用二进制,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 y1:
# print (y)
b.append(x)
elif y2:
c.append(x)
elif y3:
d.append(x)
elif y4:
e.append(x)
elif y5:
f.append(x)
elif y6:
g.append(x)
elif y7:
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瓶药水。