4-4_生日算法.pptxVIP

  • 90
  • 0
  • 约1.16千字
  • 约 7页
  • 2018-07-21 发布于山西
  • 举报
4-4_生日算法

生日算法 我们可以通过5组精心设计的数,然后问朋友5个问题,从而找出它的生日到底是在一个月中的哪一天。 每个问题都是询问他的生日是否出现在这5组数当中的一个,它只需答是或者否。当5组数都询问完后,就把他说是的那几组数的第一个数相加,其结果便是它的生日。 生日算法 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 原理 由于我们在某一天生日的范围是1~31号,如果用二进制表示的话,只要5位就足够了,因为5位能表示的范围2的5次方,即0~31,显然是包括1~31的。 换句话说,只要我们确定了这5位二进制的值,显然就确定了我们的生日到底是哪一天,而这5个位不是1就是0。所以我们就设计5组数,让每一组数去确定一个位到底是1还是0。 1/0 1/0 1/0 1/0 1/0 原理 这里的*号表示可以任意取值,只要保证右边第一位为1就可以了,显然这一组数有2^4个。如果它说这组数没有它的生日,则表示它的生日最低位不是1而是0,因为我们已经把第一位为1的所有数的可能都列了出来。 以此类推,我们设计第二组数时就把它设计为第二位全是1的数,如下图所示: * * * * 1 例如:我们把第一组数设计为最低位全是1的数: * * * 1 * 原理 至于最后我们为何可以直接拿各个组的第一个数相加,从而得出正确的结果。 那是因为,每一组数的第一个数都是基数,即1, 2, 4, 8, 16它们的二进制形式为00001, 00010, 00100, 01000, 10000。其特殊性就在于它们除了自身所确定生日的那个1之外,其余位的数都为0,这样的话它们相加是不会影响到其它位的,原本是0的还是0,确定为1的还是1。 另外有一点也很显然,那就是我们这几个特殊的基数,任意组合相加,是完全可以表示00001~11111这个范围的数的。 网站主页:http://www.believeC.com ( C语言视频教程 ) 网站主页 为了更好的排版效果,请下载:方正准圆简体和微软雅黑这两种字体。只需把这两种字体放到 C:\WINDOWS\Fonts 的文件夹中即可。

文档评论(0)

1亿VIP精品文档

相关文档