标签:改变 lock 换算 关系 inf 两种 code 获得 范围
对于一个优秀的程序员来说,学习理解一些逻辑思考题有助于开阔自己的思维,在编码过程中逻辑更加的严密完整。同时,还能增添日常枯燥生活的趣味,通过解答一道复杂的逻辑思考题,会获得慢慢的成就感,那我们还有什么理由不去学习和理解呢?
有100个囚犯,将他们站成一排依次报数,报到奇数的那个人被枪毙,接着开始下一轮报数,报到奇数的被枪毙,依次类推,到最后只剩一个人时无罪释放,假如你现在是一名囚犯,要站在第几个位置才能活到最后?
思考:100个囚犯,第一次枪毙会少一半也就是50人,第二次枪毙依然是一半,因为剩余人数是偶数,于是依次除2,到最后只剩下一人,一共需要6次枪毙。
问题是知道了枪毙次数,该如何知道最后那个幸运儿是在那个位置呢? 于是我想把问题简单化一些,换成10个囚犯,这下就简单多了,通过推演,最后的幸运儿就是第八位的那位囚犯。但我们进行了几轮枪毙呢?依照上图算法得出是3轮,3和8有什么关系呢?这时我不由想到刚学的二进制,2的3次方比就是8吗?难道?是这个规律?我赶紧将囚犯增加到20位,然后依照上图推算得出需要枪毙4轮,最后的幸运儿是16号,2的4次方刚好是16,所以该题的解决方法就是通过除2的方法算出需要多少轮,最终的幸运位置就是2的n次幂。
尽管得到了解决方法但我依然觉得我对这个方法的原理还是不够理解,不明白其中的原理究竟是为什么?通过在网上寻找答案,我终于找到了还算合理的解释,如下:
若將編號換成2進制,偶數是指尾數為0,奇數則為尾數為1。第一輪將奇數全數槍斃後,剩下人再下一輪的編號即為目前編號除以2(例:2號變1號、4號變2號),而在2進制除以2的意義即為去掉尾數的0。故能夠存活的人在2進制的編號為1000000,即為第64個人
正解:首先我们将囚犯总数换算成二进制来进行理解,奇数位枪毙即二进制最低位为1的数被枪毙,比如(二进制101,二进制111...),而那些没有被枪毙的犯人,由于经过上一轮的枪毙,他们的位置发生了改变,原本在2位置的范围变成了1位置,4位置的犯人变成了2位置,他们的位置都在原先的位置上除了2,在二进制中对偶数除2就是去0(去除最右边的0),所以要想要活得久,就必须这个数的1位置离右边越远越好,比如1000000,所以在100个人中,换算为二进制即为1100100人中,1位置最远离右边的一个数就是1000000这个数,换算为10进制就是64。
有99瓶水和一瓶毒药,需要至少多少只老鼠才能知道这100瓶液体中瓶是毒药?(提示:一只老鼠可以喝多瓶液体)
思考:如果是一只老鼠喝一瓶那就需要100只才能试出来了,显然这不是最优解。因为老鼠吃了毒药只有死和活两种可能,所以我们可以考虑用二进制来解决,用二进制来表示这100瓶液体一共需要7位数,所以答案就在其中了
正解:100瓶液体用二进制编号共需要7位,100的二进制是1100100,我们只需要7只老鼠,从左到右排序,碰到液体编号的二进制位是1就喝,是0就不喝,然后看哪些老鼠死了,然后在看他们共同喝了哪一瓶液体,并且那瓶液体没被其他老鼠喝,那瓶液体就是毒药,可能文字表示不是很形象,直接上图
标签:改变 lock 换算 关系 inf 两种 code 获得 范围
原文地址:https://www.cnblogs.com/welisit/p/12105420.html