15瓶可乐,其中有一瓶过期了,找出有毒的可乐的问题

有15瓶可乐,其中只有一瓶过期了,小白鼠喝之后两个小时会死。
请问最少用多少只小白鼠,在2小时内一定可以找出有毒的可乐?


答案:2的4次方大于15,故使用4只小白鼠就可以测出来。

解析:15瓶汽水从0001-1111进行编号,让第一只老鼠喝(从右到左)第一个位置为0的可乐,即编号为(2, 4, 6, 8, 10, 12, 14)的可乐;第二只喝第二个位置为0的可乐,即编号为(1, 4, 5, 8, 9, 12, 13)的可乐;第三只喝第三个位置为0的可乐,即编号为(1, 2, 3, 8, 9, 10, 11)的可乐;第四只喝第二个位置为0的可乐,即编号为(1, 2, 3, 4, 5, 6, 7)的可乐。

# 位运算
def calVal(val, num):
    # 与运算
    res = val & num
    return res
def main():
    list1 = []
    list2 = []
    list3 = []
    list4 = []
    for val in range(1, 16):
        v1 = calVal(val, 1) #从右往左判断第一个值为0的
        v2 = calVal(val, 2) #判断第二个值为0的
        v3 = calVal(val, 4) #判断第三个值为0的
        v4 = calVal(val, 8) #判断第四个值为0的
        if v1 == 0:
            list1.append(val)
        if v2 == 0:
            list2.append(val)
        if v3 == 0:
            list3.append(val)
        if v4 == 0:
            list4.append(val)
    print('list1 = ', list1)
    print('list2 = ', list2)
    print('list3 = ', list3)
    print('list4 = ', list4)
if __name__ == '__main__':
    main()

运算结果如下:

 

可根据编号的老鼠的死亡得出结果。若全都存活,则为15号可乐过期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值