解答微軟的一道邏輯推理題

2021-04-13 23:04:22 字數 2380 閱讀 8147

以下是微軟有名的一道邏輯推理題,網上有不少人給出了答案,但是推理過程都有些問題,在這裡我給出我的推理過程:

教授選出兩個從2到9的數,把它們的和告訴學生甲,把它們的積告訴學生乙,讓他們輪流猜這兩個數

甲說:「我猜不出」

乙說:「我猜不出」

甲說:「我猜到了」

乙說:「我也猜到了」

問這兩個數是多少

[我的解答]

設甲聽到的和為m, 乙聽到的積為n,則:

m == a11 + b11 == a12 + b12 == …… == a1n + b1n( n >= 2)

n == a21 * b21 == a22 * b22 == …… == a2k * b2k (k >= 2)

且:存在滿足:

i)(a1i == a2j && b1i == b2j (j>=2 && j<=k)) 

ii

(a1i, b1i中至少有乙個是合數 && 另乙個數乘以前面那個合數的最小因子(>1)得到的積不超過9) 

->

否則乙不會說不知道(如果不同因數分解的個數為1,則乙知道答案;而為1的可能就是:

1)因數分解為兩個質數的組合;

2)因數分解為乙個合數乘以另乙個數,該數乘以前面那個合數的最小因子(>1)得到的積會超過9)

iii)(對於任意的t, t<=n && t>= 2 && t!=i:a1t和b1t均為質數 || 乙個為合數,而對於另乙個數,如果乘以前面那個合數的最小因子(>1),會超過9)

->

否則甲不會在乙說不知道的情況下又知道了(其實就是對上面一步的結論求逆命題)

iiii

(對於任意的x, x<=k && x>=2 && x!=j: a2x, b2x中有乙個數乘以另乙個數的最小因子(>1)超過9 || a2x與b2x的和只能轉化成乙個合數與另乙個數相加的形式,其中「另乙個數」乘以這個合數的最小因子(>1)得到的積不超過9)

-> 否則乙不會在甲說知道的情況下又知道了(這句話也是最難對映成數學表達的一句話:乙能在這一步得出答案,說明(即)有所沒有的特徵。而到目前為止,我們所掌握的的特徵只有:

1)a2j, b2j中至少有乙個是合數

-> a2x, b2x均為質數(這不可能)

2)a2j, b2j中任何乙個數乘以另乙個數的最小因子(>1)不超過9

-> a2x, b2x中有乙個數乘以另乙個數的最小因子(>=1)超過9

3)a2j與b2j的和可以轉化成兩個質數相加的形式

或者可以轉化成乙個為合數與另乙個數相加的形式:其中「另乙個數」乘以這個合數的最小因子(>1)得到的積超過9

-> a2x與b2x的和只能轉化成乙個合數與另乙個數相加的形式,其中「另乙個數」乘以這個合數的最小因子(>1)得到的積不超過9

為了求出符合題意的a1i和b1i, 我們要使用逼近法來縮小範圍。

從甲的角度看:

2-9這8個數字中只有4,6,8,9這4個合數,它們與2-9中的數相加,滿足條件(ii)的只有和: 

再從乙的角度來考察,檢驗每個和:

如果m == 6: 此時() == (不滿足條件(ii))。此時n = 2 * 4 = 8。但是8只能分解成(注意取值只能在2-9之間),這與k >= 2矛盾。

如果m == 8: 存在, ,,不滿足條件(iii)。   

如果m == 9: 此時() == }(不滿足條件(ii))。此時n = 3 * 6 = 18 = 2 * 9。2 + 9 = 11 = 4 + 7 = 3 + 8。 9的最小因子(>1)為3, 2 * 3 < 9 -> 不滿足條件(iiii)的第乙個「或」部分;4的最小因子(>1)為2,7 * 2 > 9 -> 不滿足條件(iiii)的第二個「或」部分(與「只能」矛盾)。故:不滿足條件條件(iiii)。

如果m == 10: 存在,,不滿足條件(iii))。

如果m == 11: 存在, , , ,不滿足條件(iii))。

如果m == 12: 存在(, ,,不滿足條件(iii))。

最後得出:m只能是7,對應的 ==

[注] 這個推理可以改進的地方在於:「

對於任意的x, x<=k && x>=2 && x!=j: a2x, b2x中有乙個數乘以另乙個數的最小因子(>1)超過9 || a2x與b2x的和只能轉化成乙個合數與另乙個數相加的形式,其中「另乙個數」乘以這個合數的最小因子(>1)得到的積不超過9」這句話的對映。應該有更好的同構的數學表達。

一道邏輯推理題 猜生日

小明和小強都是張老師的學生,張老師的生日是m月n日,2人都知道張老師的生日是下列10組中的一天,張老師把m值告訴了小明,把n值告訴了小強,張老師問他們知道他的生日是哪一天?3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明說 如果我不知道的...

一道邏輯推理題的C 實現

題目為 周遊的騎士 來自一本邏輯推理書。實現如下 核心思想是用mytry遞迴函式來實現,check ok函式測試線索是否成立。include include define empty 1 using namespace std int b 4 5 enum name enum month enum ...

使用程式解決一道邏輯推理題

小明和小強都是張老師的學生,張老師的生日是m月n日,2人都知道張老師的生日是下列10組中的一天 3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 張老師將m值告訴了小明,將n值告訴了小強,張老師問他們知道他的生日是哪一天嗎?小明說 如果我不知道...