三個學生猜數字

2021-08-02 04:34:31 字數 3486 閱讀 3913

乙個教授邏輯學的教授,有三個學生,而且三個學生均非常聰明! 一天教授給他們出了乙個題,教授在每個人腦門上貼了一張紙條並告訴他們,每個人的紙條上都寫了乙個正整數,且某兩個數的和等於第三個!(每個人可以看見另兩個數,但看不見自己的) 教授問第乙個學生:你能猜出自己的數嗎?回答:不能 問第二個,不能 第三個,不能 再問第乙個,不能 第二個,不能 第三個:我猜出來了,是144! 教授很滿意的笑了。 請問您能猜出另外兩個人的數嗎? 請問: 第三個人是怎麼猜出來的?你是怎麼猜出另外兩個數的?

為什麼之前發了一遍給我吞了?????重發一遍

搬運乙份好的解法:

鏈結(非原文出處):

excited!!!

這真是乙個十分有趣,但細究卻十分複雜的問題。

先說本題的正解,一共5組:

(36,108)(108,36)(32,112)(64,80)(54,90)

很不可思議吧?

先說為什麼對,再說怎麼解。

基礎:為什麼這些是正解?

假設 3 個人分別是 a,b,c;

以(36,108)為例;

大前提: 在第一輪中,所有人都知道了,自己的答案只可能是兩個數之一;

所需  條件 r:排除掉其中乙個(就一定能猜到另乙個);

在第二輪中,c 運用了 

兩層邏輯:

前提:自己是 72 或 144;

假設 1:自己是 72;

推論 1:b 應該是 36 或 108; ——

假設 2:假如 b 是 36;

————

推論 2:c 應該能判斷出自己是 72;

————

已知 1:c 第一輪沒有猜出; ——

故假設2 不成立! 

—— 推論 3:b 應該 在第二輪 排除 36 (條件 r 達成); ——

已知 2:b 沒有在第二輪猜出;

故假設1 不成立!

條件r 達成,c 成功猜出!

(36,108) 是乙個比較簡單的情況,僅僅用了兩層邏輯。但是其他解其實就沒有那麼顯然了,可能是三層、四層甚至五層邏輯……(邏輯學教授恐怕也會被繞暈吧?)

所以請看第二部分:如何得到正解。

********************

高階:如何得到正解?

但是我們之前並不知道答案,那如何推得答案呢?

我的方法是,

從邏輯上,一層層死推,不要放過任何乙個線索;

本題一共 5 個條件,即 前 5 次大家都不知道正解;

還有乙個隱藏條件(即真正的大前提):0 不是正整數;

總計6個條件;

接下來,就是放大招的時刻了!

說明:

下面,是每乙個輪的每乙個回合中,某方恰能猜出來的所有必要條件;

在下面的推導過程中,所有小括號()內數字比例都是 a:b:c;

中括號【】內是指該輪猜出運用的條件;

: 0不是正整數(所以若看到另外兩個數字相同,則自己必然是它們的和);

第 1 輪:

【1.1】a 猜出

b 和 c 相同 (2:1:1);

【1.2】b 猜出

a 和 c 相同(1:2:1)

a 是 c 的 2 倍(2:3:1)【1.1】;

(理解:b 看到 a:c=2:1,但是 a 沒有猜出,所以 b 不是1,而是 3,這就是排除錯誤選項的方法,而這個邏輯是後面所有推論的核心邏輯:細究前面的人沒有猜出的原因)

【1.3】c 猜出

a 和 b 相同 (1:1:2)

a 是 b 的 2 倍 (2:1:3) 【1.1】

b 是 a 的 2 倍 (1:2:3)【1.2】

b 比 a 多 50%(2:3:5)【1.2】

第 2 輪:

(從此輪開始,每乙個人的推導,都是以前兩個人未猜出的表現為依據,所以每種情況的解的個數是前兩個之和)

【2.1】a 猜出

(3:2:1)【1.2】

(4:3:1)【1.2】

(3:1:2)【1.3】

(4:1:3)【1.3】

(5:2:3)【1.3】

(8:3:5)【1.3】

【2.2】b 猜出

(1:3:2)【1.3】

(2:5:3)【1.3】

(1:4:3)【1.3】

(2:7:5)【1.3】

(3:4:1)【2.1】

(4:5:1)【2.1】

(3:5:2)【2.1】

(4:7:3)【2.1】

(5:8:3)【2.1】

(8:13:5)【2.1】

【2.3】 c 猜出 (即本題)

以上一共 16 組解,但由於本題要求正整數,所以

數字比例中 c 必須是 144 的約數;

即(3:1:4),(1:3,4),(2:7:9),(4:5:9),(3:5:8)

綜上,本題共有 5 組解:

(36,108)(108,36)(32,112)(64,80)(54,90)

幸好只有 兩輪,如果條件再多一點,恐怕我們就要動用計算機啦!

(嗯,動態規劃嘛,可以當作演算法題)

順便,這裡也給出 第 n 次詢問能等猜出答案的解的個數 a(n) 的遞推公式: 

求:通項公式(這個是高中數學誒):

我算出來的結果是:

這個就是大名鼎鼎的 

斐波那契數列 的變體,

前 10 項分別是:1,2,4,6,10,16,26,42,68,110……

另外,我還發現了乙個重要結論:

無論初始的三個數是多少,在有限輪內必然會有人猜出;

這個問題就交給大家探索啦;

********************

最後,我有乙個小小的猜測:

這道題目居然出現在【邏輯】而不是【數學】或【演算法】中,那麼出這道題的人,很可能並沒有做對這道題。乙個可能的情況是,他只發現了(36,108)這一組解。

因為,邏輯學教授早已陣亡。

********************

另,做個廣告:

歡迎關注我的知乎專欄:看!你身邊有乙隻數學! - 知乎專欄

2015-03-19

重點在於通過第一輪奠定整個解法的基礎,即逆向思維通過確定每個人可以猜出結果的假設,來給下乙個猜測者增加排除條件,從第二輪開始,輪數多的時候就只能用動態規劃了。

玩個猜數字

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

asp數字分頁示例共三個

set rs server.createobject adodb.recordset sql select from 表 rs.open sql,conn,1,1 page cint request page n rs.recordcount rs.pagesize 12 m cint rs.pag...

三個數字比較大小

本題要求將輸入的任意3個整數從小到大輸出。輸入格式 輸入在一行中給出3個整數,其間以空格分隔。輸出格式 在一行中將3個整數從小到大輸出,其間以 相連。相信大家看到這個題目時的第一想法都是,我直接排序就好了。的確,排序是這類問題的通解,任意乙個排序演算法都可以將這道題完美解決。但是博主看到題目中只有三...