以下是微軟有名的一道邏輯推理題,網上有不少人給出了答案,但是推理過程都有些問題,在這裡我給出我的推理過程:
教授選出兩個從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值告訴了小強,張老師問他們知道他的生日是哪一天嗎?小明說 如果我不知道...