|
4 | 4 |
|
5 | 5 | - [“红色眼睛与褐色眼睛”谜题](#红色眼睛与褐色眼睛谜题)
|
6 | 6 | - [找出剩下的一个数](#找出剩下的一个数)
|
7 |
| -- [说出2199年7月2日是星期几?](#说出2199年7月2日是星期几) |
| 7 | +- [说出2199年7月2日是星期几](#说出2199年7月2日是星期几) |
| 8 | +- [梅森素数](#梅森素数) |
| 9 | +- [杯中的水是否超过一半](#杯中的水是否超过一半) |
8 | 10 |
|
9 | 11 | ## “红色眼睛与褐色眼睛”谜题
|
10 | 12 | 从前,有个小岛上只住着和尚。有些和尚的眼睛是红色的,而另一些则是褐色的。红色眼睛的和尚受到诅咒,如果得知自己的眼睛是红色的,那么当晚 12 点必须自行了断,无一例外。
|
|
13 | 15 |
|
14 | 16 | 有一天,岛上突然来了一位游客,她完全处于状况外。于是,她对和尚们说:“你们当中至少有一位的眼睛是红色的”。
|
15 | 17 |
|
| 18 | + |
| 19 | + |
16 | 20 | 这名无心的游客当天就离开了小岛,而和尚们却因第一次听到有关眼睛颜色的话题而惴惴不安。当晚,小岛上开始出现了可怕的事情......
|
17 | 21 |
|
18 | 22 | 究竟是什么事呢?
|
@@ -126,4 +130,34 @@ boolean isLeapYear(int year) {
|
126 | 130 |
|
127 | 131 | 这道题看似简单,但其实不仅需要了解“末日”算法,还需要深入了解上述模式。上面的日历中,2199 年的“末日”是星期四,所以 2199.7.11/2199.7.4 也是星期四,所以 2199.7.2 是星期二。
|
128 | 132 |
|
129 |
| -感受到康威教授末日算法的精妙之处了吧。 |
| 133 | +感受到康威教授末日算法的精妙之处了吧。 |
| 134 | + |
| 135 | +## 梅森素数 |
| 136 | +马林•梅森是法国哲学家、修道士, |
| 137 | + |
| 138 | +16 世纪,数论领域存在着一个错误的假设,而一直被认为是事实。根据这个假设,对所有素数 p,2<sup>p</sup>-1 也是素数。将素数 2,5,7 带入,结果均为负数。 |
| 139 | + |
| 140 | +从直观角度看,对素数 p,总有 2<sup>p</sup>-1 也是素数的假设成立。不过,仅仅通过几个结果就想判断命题真伪,这在数学中是最“无知”的行为。这种代入几个变量进行的测试往往以程序能够正常运行的“晴天”作为前提条件,如果遇到“雨天”,这种只经过松散测试的程序会发生很多意想不到的问题。算法的内部逻辑应该紧凑,不给 Bug 任何可乘之机。 |
| 141 | + |
| 142 | +后来,人们最终证明,p 为素数时,2<sup>p</sup>-1 的结果不一定是素数。虽然如此,有些人还是好奇,p 是什么样的素数时,2<sup>p</sup>-1 结果将为素数。为了解答这种好奇,梅森在 1644 年发表的论文里提出了如下主张: |
| 143 | + |
| 144 | +> “若 p 为 2、3、5、7、13、17、19、31、67、127、257 之一,那么 2<sup>p</sup>-1 的结果是素数。” |
| 145 | +
|
| 146 | +梅森一直希望将存在的所有素数都表示为 2<sup>p</sup>-1 这种短小而精简的公式形式。若真能找到那样一个公式,将是美丽得让人窒息的、绝妙的数学发现。不过,梅森的梦想没能实现。 |
| 147 | + |
| 148 | +随着时间的流逝,后世数学家们通过计算得出,应当删除梅森假设中的 67 和 257,而可以添加 61、89、107。就这样,从前简洁而“有理”的命题 “若 p 是素数,则 2<sup>p</sup>-1 也是素数” 已消失不见,而留下的 “p 为某值时,结果为素数,否则不是素数”等杂乱的 if-else 语句正让算法变得越来越杂乱不堪。 |
| 149 | + |
| 150 | +实际编程中,如果越来越复杂的 `if-else` 语句影响程序简洁性,那么到了某一时刻,程序员就会考虑“重构”,对于算法也是一样。后来,人们将精简的新算法献给一生都在祈祷和学习的修道士梅森: |
| 151 | + |
| 152 | +> “如果 p 为素数时 2<sup>p</sup>-1 也是素数,那么此素数为梅森素数。” |
| 153 | +
|
| 154 | +## 杯中的水是否超过一半 |
| 155 | +空房间中有个圆柱形水杯,杯口和杯底直径相同,里面有半杯左右的水。找出方法,判断杯中水超过一半还是不到一半。空荡荡的房间中没有任何可使用的器具或工具。 |
| 156 | + |
| 157 | +答案本身非常简单,不过能够真正求解的人却寥寥无几。想问题的时候,请不要考虑房间或水的温度,以及化学反应等“不讲理”的方法。另外,不允许喝杯子里的水。 |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | +即使读完题没能马上想起答案,但看到插图后能够立刻明白,也可以说很有编程的感觉。将杯子倾斜,使水面刚好到达杯口时,查看杯底的水就能得出答案了。 |
| 162 | + |
| 163 | +算法的编写与之大体相同。各位因为找不到突破口而郁闷时,甚至会怀疑给出的问题究竟有没有解。然而找到突破口后,再回首会发现,原来解决之道竟如此简单。 |
0 commit comments