猜姓氏c语言题目,猜姓氏游戏及其数学原理

猜姓氏游戏及其数学原理

在民间流行着一种能够猜出别人“年龄和姓氏”的魔术,这是一套七张的卡片,在每张卡片上分别写有64个数和64个姓氏。

用七张卡片,可以编排127个不同的年龄或姓氏(如果用8张卡片,就可以编排255个)。从《百家姓》中选取127个常见的姓氏,分别与127个数一一对应就得到下面的“数与姓氏对照表” :

准备好以上七张卡片,外加这张“数与姓氏对照表” (每个姓氏下边方框中的数,是为了说明问题而加上去的),就可以来表演这个猜年龄和姓氏的魔术了。

先说猜年龄:

这套卡片可以用来猜127岁以内的年龄。表演者一张一张地出示这七张卡片给某位观众看,只要这位观众一一回答七张卡片上“有”、“无”自己的年龄,表演者就能“猜”出这位观众的年龄。

这种“猜”年龄的方法很简单,表演者只需将观众回答“有”的那几张卡片的左上角的数字加起来,所得的和就是这位观众的年龄。比如,某位观众对七张卡片的年龄回答如下:

Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ 无 有 有 有 有 无 无

表演者只需将Ⅰ、Ⅲ、Ⅴ三张卡片的左上角的数字2、4、8、16加起来,得到的30就是这位观众的年龄。读者可以验证,30这个数确实只有卡片Ⅱ、Ⅲ、Ⅳ、Ⅴ上才有。

猜姓氏与猜年龄基本相似,只是表演者将观众回答上面“有”他姓氏的那几张卡片的左上角的数字加起来后,还得找出这个和所对应的姓氏。比如,某位观众对七卡片的姓氏回答如下:

Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ 无 有 有 无 有 无 无

表演者只先将Ⅱ、Ⅲ、Ⅴ三张卡片的左上角的数字2、4、16加起来,得到22,再从“数与姓氏对照表”中得到22这个数所对应的姓氏是“曹”,那么这个观众就一定姓“曹”了。

这个魔术,看起来神乎其神,其实原理并非高深莫测。我们只需有一点二进制数的知识,就能揭示其中的奥秘。让我们来看卡片的编制方法:

第一步,把1——127这些正整数都转换为二进制数(转换结果参见“数与姓氏对照表”中每个姓氏下边方框里的那些数)。

第二步,把二进制数中20位(从右至左的第1个数位)上是“1”的所有数填入卡片Ⅰ中,把21位(从右至左的第2个数位)上是“1”的所有数填入卡片Ⅱ中,把2位(从右至左的第3个数位)上是“1”的所有数填入卡片Ⅲ中,依次类推。比如,118这个数转换为二进制数是1110110,它在第2(按从右至左的顺序,下同)、第3、第5、第6、第7个数位上的数都是“1”,我们就把它填入卡片Ⅱ、Ⅲ、Ⅴ、Ⅵ、Ⅶ中;它在第1、第4个数位上的数都是“0”,在卡片Ⅰ、Ⅳ中就不填。

这样,七张卡片分别对应着二进制数中的7个数位。于是,当某位观众回答表演者哪几张卡片上有无他的年龄时,实际上就等于告诉表演者他的年龄的二进制数哪几位是“1”,哪几位是“0”。那么,表演者要做的事情就是把这个二进制数转换为十进制数。比如,某位观众对七卡片的年龄回答如下:

Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ 有 有 有 无 有 有 无

那么,实际上他就已经把自己年龄的二进制数0110111告诉表演者了。把二进制数0110111转换为十进制数:

2

0110111=0×2+1×2+1×2+0×2+1×2+1×2+1×2

6543210

=0+32+16+0+4+2+1=55

但在实际转换时,注意到二进制数的各位2所对应的十进制数已经写在代表这个数位的卡片的左上角了。因此表演者只需把观众回答“有”的那几张卡片的左上角的数字加起来就行了,即1+2+4+16+32=55。

至于卡片中姓氏的编排,不过是根据事先随意编好的“数与姓氏对照表”,把每个姓氏写在与它对应的数的位置上而已。

最后,顺便指出,表演过程中的“转换”工作,是在对方回答“有”或“无”的同时进行的。我们只需记住第Ⅰ张有→+1,第Ⅱ张有→+2,第Ⅲ张有→+4,第Ⅳ张有→+8,第Ⅴ张有→+16,第Ⅵ张有→+32,第Ⅶ张有→+64,转换是非常方便的。另外,如果你打算自己制作另一套纯姓氏卡片的话,那么最好把那些填在卡片上的姓氏的次序打乱,使观众不容易发现填写卡片的“规律”,这样就更能迷惑人。

n-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值