猜姓氏游戏及其数学原理
在民间流行着一种能够猜出别人“年龄和姓氏”的魔术,这是一套七张的卡片,在每张卡片上分别写有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