有人曾问 帐前卒 一道题:至少需要多少个砝码,才能称出1~50g物体?

这道题有两个变种:

1.至少需要多少砝码(左物右码),才能称出1~50g物体?

2.至少需要多少砝码(砝码可以放在任意一边),才能称出1~50g物体?

第一问可以变为: 至少多少个数字相加,可以表示1~50之间的任意数。又可以演变为:如何快速的从一堆苹果中取出你想要的个数?

第一问对于每个数字其实就是两种状态,加、不加。也就是10. 对应的公式就是对于任意数x

也就是计算机界常见的2进制表示法。当全部ai都取1时,那么1+2+4…+2^k = 2^(k+1) - 1 >= x 将x=50带入,k+1即为所求。

a^k 如果一次乘个a那么需要乘k次。如果使用二分法 那么 只需要乘log(k)取上整次就可以做完。

这样表示就会发现其实a^k 其实就是把k表示为2进制的形式。

下面写就比较好写程序了。