【Python】先玩个魔术 ,再讲二进制 - 心灵感应魔法

哈利波特之心灵感应魔法是一种常见的儿童益智游戏。表演者首先会要求观众在心中默想一个60以内的整数,然后依次将下述卡片1到卡片6出示给观众看,并询问观众他所默想的数字是否在卡片上。在卡片出示的过程中,卡片是背对表演者的,即表演者是看不到卡片的。在听完观众的6个回答之后,表演者即可"猜"出观众默想的数字,仿佛掌握了"读心术"。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

在这里插入图片描述
表演者显然没有"读心术", 他依赖于观众关于数字在不在卡片上的6个回答来计算答案。解题思路与二进制有关。一个6位的二进制数,其可以表达的最大数字是26 - 1 = 63。所以,任意60以内的整数,都可以用不超过6位的二进制数来表达。比如,41,其二进制值如下图所示:
在这里插入图片描述
我们以十进制整数(4321)₁₀来说明表3.3中的位号、位值及位权。位值1、2、3、4从低到高,分别处于位号1(个位)到位号4(千位)。而(4321)₁₀ = 4 ⅹ10³ + 3ⅹ10²+2ⅹ10¹+1ⅹ10⁰,这里的10³为位号4的位权,10⁰为位号1的位权。同理,(41)₁₀=(101001)₂中,位号6处的位值为1,其对应的位权为2⁵=32;位号2处的位值为0,其对应的位权为2¹=2。

每一个60以内的整数,均可转换成一个6位二进制数。如果对应的二进制数的第1位(最低位)为1,该数包括在卡片1中,同理,二进制第2位为1的数包括在卡片2中,… 二进制第6位为1的数包括在卡片6中。上述数字41,其二进制的第1, 4, 6位为1。读者可以看到,41只出现在卡片1,4,6中,卡片2,3,5里没有41。所以,观众每回答一个按顺序给出的问题,其实就告诉了表演者该数字6位二进制数中的其中一位是0还是1。

我们用数字58来模拟一下。卡片1,3里没有58,卡片2,4,5,6里有58。所以表演者从观众那里得到的回答从1到6依次是:无,有,无,有,有 ,有。将上述回答换成二进制就是111010。按照对应的位权把0b111010换成十进制就是32+16+8+2 = 58。

现在我们知道表演者是如何表演的了。他一直在做加法,从0值开始。如果卡片1的回答是有,加1,卡片2的回答是有,加2,卡片3有,加4,… , 卡片6有,加32。最后直接报出和数即可。

读者可以运行下述程序才模拟执行上述游戏过程:心里先默想一个数,然后运行程序,通过输入y或者n来回答6个问题。看看计算机能否猜出你默想的数,是否跟你有心灵感应。

#nummagic.py
card1 =
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值