今天表妹问了我一个题,题目如下:
一个人有一个40磅的砝码,跌落成4块.每块重量都是整数,用这四块可以称从1到40磅之间的任意整数磅的重物.
问这四块砝码各自的重量是多少?
先看一下她老师给的代码(捂脸笑哭):
如果真的按照这个方法解出来四个砝码的重量(答案是1,3,9,27)
大概需要计算 333340279*3 = 2361960次,确实理论上可以算出来,但是我赌一块巧克力我的电脑半个小时跑不出来这代码。
那么秉承着数学至上的原理,到底该怎么解这个题呢?
我想到了之前著名的《小鼠喝毒药》问题,好,我们先来看看《小鼠喝毒药问题》
题目如下:
现有8瓶药,其中有一瓶是毒药,请用最少的老鼠测出来哪瓶是毒药。
如果你觉得是八只老鼠,那么我下面将告诉你最少使用3只老鼠测出来毒药的方法:
假设七个瓶子我们编号为0,1,2,3,4,5,6,7
三只老鼠我们编号为:A,B,C
接下来我们采取如下方式喂药(✔表示喝这个瓶子的药,×表示不喝这个瓶子的药):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
A | × | × | × | × | ✔ | ✔ | ✔ | ✔ |
B | × | × | ✔ | ✔ | × | × | ✔ | ✔ |
C | × | ✔ | × | ✔ | × | ✔ | × | ✔ |
接下来等待结果就好了
如果:
ABC全死,毒药是7
AB死,C活,毒药是6
A死,B活,C死,毒药是5
A死,B活,C活,毒药是4
A活,B死,C死,毒药是3
A活,B死,C活,毒药是2
A活,B活,C死,毒药是1
A活,B活,C活,毒药是0
至此,判断完毕。如果有眼力劲儿好的同学会发现,这不就是使用了二进制嘛。
原理就是利用三只老鼠构成二进制的三个位数来表示0~7的数字(例如000代表0,001代表1……111代表7)
回到表妹的题目,四个砝码,可以表示从0~40的任意数字
二进制,四位的话最多表示15(8+4+2+1)
显然不够,那么三进制呢?(1111)3表示的数字为:
27+9+3+1 = 40
奇迹出现了,27、9、3、1,刚好加起来等于摔碎之前的重量
接下来让我们先来看卡这四个砝码(27,9,3,1)能不能称0~40的任意重量
假如称33,将27和9放左盘,3放右盘,差值刚好就是(27+9-3)=33了
其他的重量也可以这样去尝试。
那么原理呢?为什么能如此神奇?
神奇的地方在于,三进制的数字,上一位减去下一位等于下一位的两倍,也就是说:
(100)3 – (10)3 = (20)3
那比如33的三进制是(1020)3,那我们单看这个,可能会说我们需要2个重量为3的砝码,利用上面的粗体公式,我们可以可以发现,将重量为9的砝码放在左盘,重量为4(3+1)的砝码放在右盘,就会得到我们想要的为6的重量差了
至此,不用八层for循环嵌套,通过笔和草稿纸得出答案。
如果各位jio的小编写的还阔以的话,点个赞再走吧~感谢感谢!