- 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 的文件夹中即可。
您可能关注的文档
最近下载
- 经营分析会,必须要讲清楚的几个指标(25页 PPT).pptx VIP
- 总经理营销总监经营例会运营分析模板PPT.pptx VIP
- 新人教版九年级语文上册期末测试卷及答案【审定版】.doc VIP
- 2025 经营分析核心指标及搭建指南(23页 PPT).pptx VIP
- 风电项目建设标准强制性条文监督检查计划.docx VIP
- 奥的斯 HAA21310BW(ACD5-MRL 40A)电气原理图.pdf VIP
- 洛阳市第五人民医院2026年编外人员公开招聘备考题库及一套答案详解.docx VIP
- 畜禽屠宰加工企业消防安全指南.docx VIP
- DND传奇职业可选专长.docx VIP
- 洛阳市第五人民医院2026年编外人员公开招聘备考题库及完整答案详解一套.docx VIP
原创力文档

文档评论(0)