15
15
16
16
有一天,岛上突然来了一位游客,她完全处于状况外。于是,她对和尚们说:“你们当中至少有一位的眼睛是红色的”。
17
17
18
- ![ island-eye-color] ( island-eye-color.jpg )
18
+ ![ island-eye-color] ( /images/ island-eye-color.jpg)
19
19
20
20
这名无心的游客当天就离开了小岛,而和尚们却因第一次听到有关眼睛颜色的话题而惴惴不安。当晚,小岛上开始出现了可怕的事情......
21
21
@@ -41,16 +41,16 @@ if ((思考时间 > 2 分钟) || (已经知道答案了吗)) {
41
41
42
42
再考虑更复杂的情况。如果有 3 个红眼和尚,又会是怎样呢?平时,这 3 位会看到两个红眼和尚,所以听到游客的话后,都不会选择自杀。第一晚过后,他们又会想,另外两个和尚在第二天晚上都会自杀(就是前面探讨的“有两个红眼和尚”的情形)。到了第三天早上,看到本以为会自杀的另两个和尚并没有自杀时,根本没想到自己也是红眼和尚的这 3 人会同时受到极大的打击。因为,两个红眼和尚第二天晚上也没有自杀,这表明还有一个红眼和尚,而这第三个红眼和尚正是自己。
43
43
44
- 这种逻辑会反复循环。因此,该题的答案是“若小岛上共有 n 个红眼和尚,那么第 n 个晚上这些和尚会同时自杀”。离入,小当时共有 5 个红眼和尚,那么第 5 个晚上,这 5 个红眼和尚会同时自杀。
44
+ 这种逻辑会反复循环。因此,该题的答案是“若小岛上共有 n 个红眼和尚,那么第 n 个晚上这些和尚会同时自杀”。例如,小岛上共有 5 个红眼和尚,那么第 5 个晚上,这 5 个红眼和尚会同时自杀。
45
45
46
- 这道题其实可以利用递归的方法。假设红眼和尚人数 N 为 10,那么我们可以适用 N 为 9 的逻辑。同理,N 为 8 或 7 时,都适用 ` N-1 ` 时的逻辑。将 ` N=1 ` ,即“只有一个红眼和尚”视为终止条件,即可得出最终结果。这种过程与计算机算法中函数的递归调用过程完全相同或给 。
46
+ 这道题其实可以利用递归的方法。假设红眼和尚人数 N 为 10,那么我们可以适用 N 为 9 的逻辑。同理,N 为 8 或 7 时,都适用 ` N-1 ` 时的逻辑。将 ` N=1 ` ,即 “只有一个红眼和尚” 视为终止条件,即可得出最终结果。这种过程与计算机算法中函数的递归调用过程完全相同 。
47
47
48
48
## 找出剩下的一个数
49
49
有一个能保存 99 个数值的数组 ` item[0], item[1],...item[98] ` 。从拥有 ` 1~100 ` 元素的集合 {1,2,3,...,100} 中,随机抽取 99 个元素保存到数组。集合中共有 100 个元素,而数组只能保存 99 个数值,所以集合中会剩下一个元素。编写程序,找出最后剩下的数。
50
50
51
51
还是先花 2 分钟想一想吧。
52
52
53
- 好了,这个问题其实非常简单,但没能正确理解提议的读者可能认为很难 。答案如下代码所示。
53
+ 好了,这个问题其实非常简单,但没能正确理解题意的读者可能认为很难 。答案如下代码所示。
54
54
55
55
``` java
56
56
int res = 5050 ;
@@ -63,11 +63,11 @@ System.out.println("最后剩下的数是:" + res);
63
63
如果将集合的 100 个数值累加,会得到 5050。依次从 5050 减去数组中的 99 个数值,最后的数就是没能保存到数组的那个剩余数值。也许很多读者想到了与此相近的算法。即使没有得到正确答案也不用失望,因为真正应该感到失望的人是那些没能找到答案后轻易选择放弃、想要直接查看正确答案的人。
64
64
65
65
## 说出2199年7月2日是星期几
66
- 先公布答案吧,2199年7月2日是星期二 。其实可以靠运气蒙一下,准确率是 1/7。要想真正求出正确答案,过程并不简单。也许有些读者会自己设计精妙算法求出正确答案,但我还是想通过约翰•康威教授的“末日”算法进行说明。
66
+ 先公布答案吧,2199 年 7 月 2 日是星期二 。其实可以靠运气蒙一下,准确率是 1/7。要想真正求出正确答案,过程并不简单。也许有些读者会自己设计精妙算法求出正确答案,但我还是想通过约翰•康威教授的“末日”算法进行说明。
67
67
68
- 末日算法虽然不是“游戏”,但在聚会中能够引起初次见面的异性的好奇。因此,为不少“花花公子”踏入数学殿堂做出了很大贡献。例如,“美丽的女士,求告诉我您的生日 ,让我猜猜是星期几。”“请您随便说一个年份,我会猜出当年的情人节是星期几”。虽然听起来比较肉麻,不过这样就能一下子吸引对方的注意。
68
+ 末日算法虽然不是“游戏”,但在聚会中能够引起初次见面的异性的好奇。因此,为不少“花花公子”踏入数学殿堂做出了很大贡献。例如,“美丽的女士,请告诉我您的生日 ,让我猜猜是星期几。” “请您随便说一个年份,我会猜出当年的情人节是星期几”。虽然听起来比较肉麻,不过这样就能一下子吸引对方的注意。
69
69
70
- 康威教授的末日算法执行环境就是我们今天使用的“公历 ”环境。
70
+ 康威教授的末日算法执行环境就是我们今天使用的“** 公历 ** ”环境。
71
71
72
72
首先,先理清楚** 什么是闰年** 。闰年是年份能被 4 整除但不能被 100 整除,或者能被 400 整除的年份。闰年 2 月有 29 天,而平年 2 月是 28 天。
73
73
@@ -110,13 +110,13 @@ boolean isLeapYear(int year) {
110
110
6, 11.5, 17, 23, 28, 34, 39.5, 45, 51, 56, 62, 67.5, 73, 79, 84, 90, 95.5
111
111
```
112
112
113
- 就是说,1900 年“末日”是星期三,那么 1906,1917,1923... “末日”也是星期三, 11.5 表示 1911 年的“末日”是星期二(-1),而1912 年的“末日”是星期四(+1)。记住这个列表,我么就能够胜场所有 20 世纪年份的“末日基准”了。
113
+ 就是说,1900 年“末日”是星期三,那么 1906,1917,1923... “末日”也是星期三, 11.5 表示 1911 年的“末日”是星期二(-1),而1912 年的“末日”是星期四(+1)。记住这个列表,我们就能够算出所有 20 世纪年份的“末日基准”了。
114
114
115
115
如果一个美丽的姑娘说“我的生日是 1992.9.13” 时,我们可以马上说出当天的星期。既然康威列表有 90 这个数字,表示 1990 年的“末日”也是星期三,那么 1901 年(平年)“末日”是星期四(+1),1902 年(闰年)“末日”是星期六(+2),所以 9.5/9.12 也是星期六,1992.9.13 就是星期日。
116
116
117
117
不过,** 年份跨越世纪时,康威列表就会失去作用** 。
118
118
119
- 题目中问的是 2199.7.2 的星期,如果不能得知 2199 年“末日”是星期几,那么这道题很难求解。对于不同世纪的年份,没有什么特别的方法能够猜出“末日”的星期。只能将被 100 整除的年份表示为日历形式时,得到一些规律而已 。
119
+ 题目中问的是 2199.7.2 的星期,如果不能得知 2199 年“末日”是星期几,那么这道题很难求解。对于不同世纪的年份,没有什么特别的方法能够猜出“末日”的星期。只能将被 100 整除的年份表示为日历形式时,从中得到一些规律而已 。
120
120
121
121
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
122
122
| ---| ---| ---| ---| ---| ---| ---|
@@ -133,9 +133,7 @@ boolean isLeapYear(int year) {
133
133
感受到康威教授末日算法的精妙之处了吧。
134
134
135
135
## 梅森素数
136
- 马林•梅森是法国哲学家、修道士,
137
-
138
- 16 世纪,数论领域存在着一个错误的假设,而一直被认为是事实。根据这个假设,对所有素数 p,2<sup >p</sup >-1 也是素数。将素数 2,5,7 带入,结果均为负数。
136
+ 马林•梅森是法国哲学家、修道士。16 世纪,数论领域存在着一个错误的假设,而一直被认为是事实。根据这个假设,对所有素数 p,2<sup >p</sup >-1 也是素数。将素数 2,5,7 带入,结果均为负数。
139
137
140
138
从直观角度看,对素数 p,总有 2<sup >p</sup >-1 也是素数的假设成立。不过,仅仅通过几个结果就想判断命题真伪,这在数学中是最“无知”的行为。这种代入几个变量进行的测试往往以程序能够正常运行的“晴天”作为前提条件,如果遇到“雨天”,这种只经过松散测试的程序会发生很多意想不到的问题。算法的内部逻辑应该紧凑,不给 Bug 任何可乘之机。
141
139
0 commit comments