標籤:

一個教授邏輯學的教授,有三個非常聰明的學生,怎麼猜數字的?

不是新問題了,網上沒找到滿意的答案。

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

請問: 第三個人是怎麼猜出來的?你是怎麼猜出另外兩個數的?


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

先說本題的正解,一共5組:
(36,108)(108,36)(32,112)(64,80)(54,90)

很不可思議吧?
先說為什麼對,再說怎麼解。

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

假設 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) 是一個比較簡單的情況,僅僅用了兩層邏輯。但是其他解其實就沒有那麼顯然了,可能是三層、四層甚至五層邏輯……(邏輯學教授恐怕也會被繞暈吧?)

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

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

【2】進階:如何得到正解?

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

我的方法是,從邏輯上,一層層死推,不要放過任何一個線索;

本題一共 5 個條件,即 前 5 次大家都不知道正解;
還有一個隱藏條件(即真正的大前提):0 不是正整數;
總計6個條件;

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

說明:

  1. 下面,是每一個輪的每一個回合中,某方恰能猜出來的所有必要條件;
  2. 在下面的推導過程中,所有小括弧()內數字比例都是 A:B:C;
  3. 中括弧【】內是指該輪猜出運用的條件;

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

第 1 輪

【1.1】A 猜出

  1. B 和 C 相同 (2:1:1)【0】;

【1.2】B 猜出

  1. A 和 C 相同(1:2:1) 【0】
  2. A 是 C 的 2 倍(2:3:1)【1.1】;

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

【1.3】C 猜出

  1. A 和 B 相同 (1:1:2) 【0】
  2. A 是 B 的 2 倍 (2:1:3) 【1.1】
  3. B 是 A 的 2 倍 (1:2:3)【1.2】
  4. B 比 A 多 50%(2:3:5)【1.2】

第 2 輪:

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

【2.1】A 猜出

  1. (3:2:1)【1.2】
  2. (4:3:1)【1.2】
  3. (3:1:2)【1.3】
  4. (4:1:3)【1.3】
  5. (5:2:3)【1.3】
  6. (8:3:5)【1.3】

【2.2】B 猜出

  1. (1:3:2)【1.3】
  2. (2:5:3)【1.3】
  3. (1:4:3)【1.3】
  4. (2:7:5)【1.3】
  5. (3:4:1)【2.1】
  6. (4:5:1)【2.1】
  7. (3:5:2)【2.1】
  8. (4:7:3)【2.1】
  9. (5:8:3)【2.1】
  10. (8:13:5)【2.1】

【2.3】 C 猜出 (即本題)

  1. (3:2:5)【2.1】
  2. (4:3:7)【2.1】
  3. (3:1:4)【2.1】
  4. (4:1:5)【2.1】
  5. (5:2:7)【2.1】
  6. (8:3:11)【2.1】
  7. (1:3:4)【2.2】
  8. (2:5:7)【2.2】
  9. (1:4:5)【2.2】
  10. (2:7:9)【2.2】
  11. (3:4:7)【2.2】
  12. (4:5:9)【2.2】
  13. (3:5:8)【2.2】
  14. (4:7:11)【2.2】
  15. (5:8:13)【2.2】
  16. (8:13:21)【2.2】

附上一張直觀的圖:

以上一共 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) 的遞推公式:
a(1)=1,a(2)=2,a(3)=4,
a(n)=a(n-1)+a(n-2),(ngeq 4)

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

我算出來的結果是:
a(n)=frac{sqrt{5}+3 }{sqrt{5} }(frac{1+sqrt{5} }{2} )^{n-2} + frac{sqrt{5}-3 }{sqrt{5} }(frac{1-sqrt{5} }{2} )^{n-2} ,n>1

這個就是大名鼎鼎的 斐波那契數列 的變體,
前 10 項分別是:1,2,4,6,10,16,26,42,68,110……

另外,我還發現了一個重要結論:
無論初始的三個數是多少,在有限輪內必然會有人猜出;

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

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

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

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

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

【轉載請註明作者及鏈接地址,商業轉載需徵求我同意並商討稿費,謝謝理解。】

另,做個廣告:
歡迎關注我的知乎專欄:看!你身邊有一隻數學! - 知乎專欄


與某位少俠思路一樣 解答過程如圖 若有錯誤望指正

真的會有人看嗎!
我都不想看了


首先要理清一個容易混淆的地方,就是本題中涉及了幾個角色。
最明顯的是三個學生——假設他們是A、B、C,他們分配到的數是a、b、c——是遊戲的主體。他們每個人的任務,都是在具體的某一局遊戲當中,推測自己的數。其實,在看到另外兩人的數的那一刻,他們就會知道,自己的數不是這兩數之和,就是這兩數之差,肯定是這其中的一個;接下來所有的推理,都是在分辨到底是和還是差。
然後一個沒什麼存在感的角色是教授,負責設計遊戲的三個數,讓學生來猜。教授只要隨便找一個正整數加法的算式就可以了,根本不需要任何細緻的推理。
最後一個角色是做題的「我們」。本題的要求是,讓我們根據「在第二輪時C說出144」這個事實,來推測教授可能選用了哪個(包含144的)算式。注意,我們的任務是找所有可能的遊戲,而不是參與到具體某一局之中去推理。

明晰了不同角色的定位,就可以做題了,具體參見 @曾加 的回答,我完全贊同,不再贅述。
然而,還可以換一個角度補充幾句。讓我們思考一下,假如我們是A、B、C中的一個,我們該如何玩這個遊戲呢?到底是怎麼推理的?下面以(36, 108, 144)為例,模擬一下三位學生的推理過程,也算是對答案的一個驗證。下文中的「!=」意思是「不等於」。

首先,教授把(36, 108, 144)三個數分配給A、B、C三人,即a = 36, b = 108, c = 144。然後開始依次詢問。

第一個是A。當他看到b = 108, c = 144的時候,他就知道自己的候選集是{36, 256},自己的數a肯定是這兩者中的一個。到底是哪個,無從得知,所以他說「不確定」。
這裡要注意一點,單單看到別人的兩個數,一般是無法判斷自己的數的,因為不知道是和還是差。但有一種情況下能做出判斷,那就是別人的兩個數相等的時候。比如,你看到另外兩個數都是21,那自己只能是21 + 21 = 42,因為21 - 21 = 0不是正整數。「他們相等,我就是和」這一點是整個遊戲的基石,是能得出定論的根本。

遊戲繼續,輪到B了。B看到a = 36, c = 144,也就確定了自己的候選集是{108, 180},同樣無法判斷自己的數b是哪個。
然後,還沒完,B根據A說的「不確定」,得出了b != c的結論。也就是說,B想:「如果我是144,那A看到兩個144,就會得出自己是288的結論,不會說不確定。所以我的數不是144。」
這個b != 144的結論,看似沒有什麼用,因為B的候選集{108, 180}里本來就沒有144,何須再排除一次。但是,這個結論對別人是有用的,因為別人並不知道B的候選集是什麼。伴隨著B說的「不確定」,這個信息就流傳了下去。

然後視角來到C處。C看到a = 36, b = 108,也得出了自己的候選集{72, 144}。然後,根據a的「不確定」,判斷出c != b即c != 108;根據b的「不確定」,判斷出c != a即c != 36。於是C的排除集是{108, 36}。
僅僅這些嗎?不,還有最關鍵的一點:C還能挖掘利用【B根據A說的「不確定」得出了b != c的結論但仍然說「不確定」】這一點。C想:「B聽到A說『不確定』,應該能判斷出b != c。然而,這一點並沒有幫助B從他的候選集里排除一個數,所以,我的數c,並不在B的候選集里。」B的候選集是什麼?是|a +- c|。c不在其中,也就是說a + c != c、a - c != c、c - a != c,也就是說,c != a / 2即c != 18。C的排除集擴展成了{108, 36, 18},依然和C的候選集{72, 144}交集為空,所以C也只能說「不確定」。

這樣,第一圈就轉完了。總結一下,三人的推理如下:
A:候選集:{36, 256};排除集:{};條件:b、c;結論:不確定。
B:候選集:{108, 180};排除集:{144};條件:a、c、A不確定;結論:不確定。
C:候選集:{72, 144};排除集:{108, 36, 18};條件:a、b、A不確定、B不確定、B知道【A不確定】後仍不確定;結論:不確定。

第二回合也是相似的玩法,只是更加複雜而已。

第二輪A可利用的條件有四個:
B知道【A不確定】後仍不確定;
C知道【A不確定】後仍不確定;
C知道【B不確定】後仍不確定;
C知道【B知道『A不確定』後仍不確定】後仍不確定。
由第一個條件可知,c不在B的候選集中,即|a +- c| != c,可得a != 2c即a != 288;
由第二個條件可知,b不在C的候選集中,即|a +- b| != b,可得a != 2b即a != 216;
由第三個條件可知,a不在C的候選集中,即|a +- b| != a,可得a != b / 2即a != 54;
最後一個條件,A想:「A不確定,說明b != c,B顯然意識到了這一點,但仍然沒能得出定論,說明c不在B的候選集中,|a +- c| != c即c != a /2。然而這一點一定會被C意識到,但他也沒能排除什麼,說明a / 2不在C的候選集中,|a +- b| != a / 2可得a != 2b / 3即a != 72。」
於是,A的排除集變為{288, 216, 54, 72},仍然與A的候選集沒有交集,不可排除,仍然是不確定。

然後就又輪到B了。B經過一番類似的思考後,也沒能得出結論,於是就又輪到了C。C經過複雜的思考之後,終於在排除集中出現了72,從而確定自己是144。具體的思考過程,留作習題。

總之,通過上述的模擬,證實了如果遊戲真是這樣,那C確實會在第二輪的時候得出自己是144的結論,從而驗證了(36, 108, 144)確實是一個解。同理,其他的4個解都可以用類似的方法驗證。

習題1:思考這段分析與曾加的答案的聯繫。
習題2:思考這段分析與斐波那契數列的聯繫。
習題3:模擬第二輪中B與C的推理過程。
習題4:還有一種「假設排除法」,比如C在第一輪會想:「如果我是72,那麼,……,沒什麼矛盾;如果我是144,那麼,……,也沒什麼矛盾:所以不確定。」;在第二輪會想:「如果我是72,那麼,……,矛盾,所以我是144。」。思考這種方法與本文方法的聯繫。(提示:遞歸與遞推。)


#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = "FreeMind"

class Solution:

def __init__(self, rounds, person, number):
self.rounds = rounds
self.person = person
self.number = number

def solution(self):
if self.rounds == 1:
if self.person == 1:
return [[2, 1, 1]]
elif self.person == 2:
return [[1, 2, 1], [2, 3, 1]]
else:
return [[1, 1, 2], [2, 1, 3], [1, 2, 3], [2, 3, 5]]
a = [[2, 1, 1]]
b = [[1, 2, 1], [2, 3, 1]]
c = [[1, 1, 2], [2, 1, 3], [1, 2, 3], [2, 3, 5]]
results = [a, b, c]
iterationNumber = (self.rounds - 2) * 3 + self.person
for i in range(iterationNumber):
if i % 3 == 0:
results[0] = [[x[1]+x[2], x[1], x[2]] for x in results[1] + results[2]]
elif i % 3 == 1:
results[1] = [[x[0], x[0]+x[2], x[2]] for x in results[0] + results[2]]
else:
results[2] = [[x[0], x[1], x[0]+x[1]] for x in results[0] + results[1]]
return results[self.person-1]
def __str__(self):
result = filter(lambda x:not self.number%max(x), self.solution())
result = map(lambda x:[x[0]*self.number/sum(x)*2, x[1]*self.number/sum(x)*2, x[2]*self.number/sum(x)*2],result)
res = ""
for i in result:
res += str(i)+"
"
return res.replace("[","(").replace("]", ")")
__repr__ = __str__

if __name__ == "__main__":
print Solution(2, 3, 144) #對應位置參數依次為輪數,最先知道答案的人,所知結果
## print:
## (108, 36, 144)
## (64, 80, 144)
## (54, 90, 144)
## (36, 108, 144)
## (32, 112, 144)


其實一切都是從2、1、1三個數字演化而來的。

我們先約定一種表示方式:同學ABC面對面圍坐在一起,各自的數除去最大公約數後為abc,表示為下圖所示的符號。

(這是我自己思考時用的符號,個人感覺比直接寫成三元數組的坐標形式要直觀些)

如圖,如果ABC分別是211,那麼A1最先猜出。下面考慮由211演化出的231,在B的猜測里b可能等於1或3,在A1「不知道」的信息傳遞給B後,B則知道b為3,B1最先猜出。


請注意這兩個過程的對應:
①B1從A1處獲得信息,從而最先猜出,即有效信息從A1傳遞到B1;
②數字由A1最先猜出的組合211演化為由B1最先猜出的組合231,演化過程是b由另外兩個數之差變成了和(因為前一種情況被A1表達的信息排除掉了,所以B1則可以最先猜出)。


如果以上過程你理解了,那麼下面咱們就來類推了。

C2的猜出,向前追尋有效信息可以是A2或B2,再從A2或B2向上追尋,一直到初始有效信息,形成16條有效信息鏈,而C2正處於這些信息鏈的末端。

把這些信息傳遞的過程對應上數字演化過程,我們可以得到下圖

根據144的質因數分解狀況,找出16種數字組合中符合條件的解,最後乘上公因數便得到最終答案。

=================================

另外,用這個思路可以很容易地證明曾少俠@曾加答案中提到的結論:無論是怎樣的三個初始數,在有限回合內一定有人能猜出。

我們只需要把每個數組中最大的數換成兩個較小數之差(當然,必須是正數)。將這個過程不斷進行下去,在有限回合內一定可以得到有兩個數相等的數組。並且對應有效信息傳遞的過程,我們可以得出是哪位同學、在第幾次回答時最先猜出。

PS: 請原諒我這狗扒一樣的字 (╥﹏╥)


終於解出來啦!發現跟第一名的答案方法有些類似(相對繁瑣了些),anyway,還是很開心好么,所以來跟大家分享一下~~~
基本的思路是這樣:1.答案由C在第二輪猜出(C2表示),因此A1,B1,C1,A2,B2這五輪都沒有人猜出。2.在兩個可能的答案中猜出結果,意味著排除了錯誤的答案。3.猜出的前提是這些數之間具有的特殊聯繫,每次猜不出都會揭示更多的否定條件

設三個數分別為a,b,c
A1;非c=b
B1:非c=a,
非b=c,即非a=b+c=2c,即非c=0.5a
C1:非a=b
非c=a,即非b=a+a=2a,即b=2a
非c=0.5a,即非b-a=0.5a且a-b=0.5a,即非b=1.5a或b=0.5a
A2:(考慮B1,C1)
非a=c,即非b=a+c=2c,即非c=0.5b
非a=2c(c=0.5a)即非b+c=2c且非b-c=2c,即非c=b(重)且非c=1/3b
非a=b,即非c=a+b=2b,即非c=2b
非a=0.5b(b=2a)即非b-c=0.5b且c-b=0.5b,即非c=0.5b(重)且非c=1.5b
非a=2/3b(b=1.5a)即非b-c=2/3b且c-b=2/3b即非c=1/3b(重)且非c=5/3b
非a=2b(b=0.5a)即非b+c=2b且非c-b=2b即非c=b(重)且非c=3b
B2:(考慮C1,A2)
非b=a,即非c=2a
非b=2a,即非a+c=2a且非c-a=2a,即非c=a(重)且非c=3a
非b=1.5a,即非a+c=1.5a且非c-a=1.5a,即非c=0.5a(重)且非c=2.5a
非b=0.5a,即非c-a=0.5a且非a-c=0.5a,即非c=1.5a且非c=0.5a(重)
非b=2c(c=0.5b),即非a-c=2c,即非c=1/3a
非b=3c(c=1/3b),即非a-c=3c,即非c=1/4a
非b=0.5c(c=2b),即非a-c=0.5c,即非c=2/3a
非b=2/3c(c=1.5b),即非a-c=2/3c,即非c=3/5a
非b=3/5c(c=5/3b)即非a-c=3/5c即非c=5/8a
非b=1/3c(c=3b)即非a-c=1/3c即非c=3/4a
C2:(考慮A2,B2)
非c=0.5b, 即a-b=0.5b(a=1.5b),即c=a+b=2.5b 3:2:5
非c=1/3b,即a-b=1/3b(a=4/3b),即c=7/3b 4:3:7
非c=2b,即a-b=2b(a=3b),即c=4b 3:1:4 (108,36,144)
非c=1.5b,即a=2.5b,,即c=3.5b 5:2:7
非c=5/3b,即a=8/3b,即c=11/3b 8:3:11
非c=3b,即a=4b,c=5b 4:1:5
非c=2a,即b=3a,即c=4a 1:3:4(36,108,144)
非c=3a,即b=4a,c=5a 1:4:5
非c=2.5a,即b=3.5a,c=4.5a 2:7:9(32:112:144)
非c=1.5a,即b=2.5a,c=3.5a 2:5:7
非c=1/3a,即b=4/3a,c=7/3a 3:4:7
非c=1/4a即b=5/4a,c=9/4a 4:5:9(64,80,144)
非c=2/3a即b=5/3a,c=8/3a 3:5:8(54,90,144)
非c=3/5a即b=8/5a,c=13/5a 5:8:13
非c=5/8a即b=13/8a,c=21/8a 8:13:21
非c=3/4a即b=7/4a,c=11/4a 4:7:11

因為a,b,c都是正整數,最終有5組滿足條件的解(108,36,144),(36,108,144),(32:112:144),(64,80,144),(54,90,144)


謝邀。挺簡單的,窮舉即可
首先,每個人看到另外兩個數字時只會得到兩個預想的答案:1,兩者之和;2,兩者之差
那麼在什麼情況下,自己能夠在看到另外兩人的數字後立刻得知自己的是多少呢。那就是當另外兩人數字是一樣的時候。
所有A說,不知道,意味著提供給B和C信息是,你們倆的數字是不同的。既BC數字比值不是1:1,既ABC比值不為(2:1:1)
那麼對於B,他就得到了另一個有用信息。所以如果他見到AC兩人的數字其中一個是另一個的兩倍,他也能立刻知道自己的數字。既可以排除ABC比值為(1,2,1)或(2,3,1)
好了,這時候到C了,首先,他看到的A和B兩個數字不一樣,其次他知道自己的數字不是A的兩倍,也知道自己和C的數字不一樣。但是他依然得不到結論。
也就是說,他見到的ABC的數字比例關係並不是(1,2,3)(2,3,5)(2,1,3)(1,1,2)
這時候,又回到A,他雖然第一圈下來並不知道結果,但是他聽了B和C的話又得到了新的信息。
可是他還不知道,所以ABC的數字比值不是(3,2,1),(4,3,1),(5,2,3),(8,3,5),(4,1,3),(3,1,2)
然後又到了B,他依然不知道,那麼由此可知,ABC比值不是(1,4,3),(2,7,5),(2,5,3),(1,3,2),(3,4,1),(4,5,1),(5,8,3),(8,13,5),(4,7,3)(3,5,2)
重點來了
這時候C突然就知道了。
也就是說,他從A或者B的第二輪得到了有用信息,那麼ABC有可能的情況是:(3,2,5)(4,3,7)(5,2,7)(8,3,11),(4,1,5)(3,1,4)(1,4,5)(2,7,9)(2,5,7)(1,3,4)(3,4,7),(4,5,9)(5,8,13)(8,13,21)(4,7,11)(3,5,8)
由於是正整數,所以最後一位必須是144的因數。那麼可以排除掉許多項只剩下
(3,1,4)(2,7,9)(1,3,4)(4,5,9)(3,5,8)

分別對應
108,36,144
32,112,144
36,108,144
64,80,144
54,90,144


其實這類問題有很多.所謂的"難",其實指的是在看題/理清題意上的困難,和暴力窮舉時的煩瑣,真正技術上來講並不"難".
很多題目所謂的做法其實就是窮舉,只是對於具體題目具體分析,可能不斷會注意到某些可利用的性質,然後剪枝比較明顯罷了..
也許某種類型的問題很常見,規則大體相同,只是具體題目有某些具體細節的差異(其實不妨說題目本身是帶有一些參數的,只是定義域太大了所以隨便抽都能算是一個新題).
像這樣的,倒是很可能會被抽象出一些比較有效的剪枝方式,或者說,這就是這類問題的一些技巧,或者說是方法.
舉個栗子,數獨.所謂的數獨,其實本質上也是窮舉,只是被人研究太多了所以手推的時候啟發函數的作用經常相當明顯罷了..
然而還有一些問題一般並沒有組成這樣的大類,所以不值得/沒辦法抽象出一些大類里普遍適用的適合手算的"方法",比方說就這題....([s]強行把話題拉回去....[/s])
所以我覺得這種問題所謂的手推沒多大意義..弄出結果來就行了..抽象不出模型的東西不值得抽象出啥技巧..
所以像"這種方法比那種方法要多試了一些結果/剪枝的時候研究得更深入細緻所以一堆雜七雜八的分析後能剪掉更多"根本沒意義..
ps.既然像這種東西要弄出所謂的手推的技巧沒多大意義了..那使用計算機也就沒所謂了對吧..嗯,倒不如說這個問題的價值也不必那個最終能成功的程序的演算法多多少..
(hmm..我就不說用prolog寫程序了....)
說到電腦..再說回數獨吧..一個好的演算法對數獨完全是秒的..然而手推還是有樂趣的..就是因為抽象出了很多在所有數獨題目都適用的適合手推的技巧..

################################ 每次見到這種東西就吐滿肚子苦水槽於是再次強行把話題拉回原題的分割線 ################################

記三個人依次為A,B,C,對應的數依次為a,b,c.
首先,總共有6次判斷.我們依次記為P1,...,P6.
記Qi為P1且P2且...且Pi.於是,我們要求的是滿足Q6的(a,b,c).
顯然,對於某個i,第i次判斷的那個人面對(a,b,c),會猜測自己是另兩人的 和 或 差的絕對值,對應兩個局面.
於是(a,b,c)滿足Qi等價於對應的這兩個局面都滿足Q(i-1).
################################################################
# 說得比較抽象,而且畢竟不是競賽,就不去寫嚴謹了..
# 舉個栗子吧..對i=5,B看到(a,_,c)後會認為局面有可能是(a,a+c,c)或(a,|a-c|,c).
# 然後B就會想..
# "假如A看到的是(_,a+c,c),會不會有多解呢..如果是看到(_,|a-c|,c)呢..
# 總之,如果兩個中有哪個沒有多解,那前4次就不會有這種狀況了,所以肯定是另外一個,那我就能確定了."
# 所以,B不能確定當且僅當這兩個均對應了第四次判斷的多解.
################################################################

回到原題..先上一些代碼吧..
算了改變主意了不碼代碼了還是先直接手推吧..
[s](所以上邊那堆到底是幹嗎的....)[/s]

Q1: b&<&>0,c&<&>0,b&<&>c
Q2: (a,a+c,c),(a,|a-c|,c)均滿足Q1
a&<&>0,b&<&>0,c&<&>0,a&<&>c,b&<&>c,a&<&>2c
Q3: (a,b,a+b),(a,b,|a-b|)均滿足Q2
a&<&>0,b&<&>0,c&<&>0,a&<&>b,a&<&>c,b&<&>c,2a&<&>b,a&<&>2b,a&<&>2c,3a&<&>2b
Q4: (b+c,b,c),(|b-c|,b,c)均滿足Q3
a&<&>0,b&<&>0,c&<&>0,a&<&>b,a&<&>c,b&<&>c,2a&<&>b,a&<&>2b,a&<&>2c,2b&<&>c,b&<&>2c,3b&<&>2c,3a&<&>2b,b&<&>3c,3b&<&>c,5b&<&>3c
Q5: (a,a+c,c),(a,|a-c|,c)均滿足Q4
a&<&>0,b&<&>0,c&<&>0,a&<&>b,a&<&>c,b&<&>c,2a&<&>b,a&<&>2b,2a&<&>c,a&<&>2c,2b&<&>c,b&<&>2c,3a&<&>c,a&<&>3c,a&<&>4c,3b&<&>c,b&<&>3c,3a&<&>2b,3a&<&>2c,2a&<&>3c,3b&<&>2c,3a&<&>4c,5a&<&>2c,3a&<&>5c,5b&<&>3c,5a&<&>8c
Q6: (a,b,a+b),(a,b,|a-b|)中一個不滿足Q5,一個滿足Q5且對應的c=144

分兩種情況..
I.a+b=144,(a,b,a+b)滿足Q5,(a,b,|a-b|)不滿足Q5.
a+b=144隻有有限組解,故窮舉可破,結果是(32,112,144),(36,108,144),(54,90,144),(64,80,144),(108,36,144).
II.|a-b|=144,(a,b,|a-b|)滿足Q5,(a,b,a+b)不滿足Q5.
從"(a,b,a+b)不滿足Q5"得到一個等式,再和|a-b|=144聯立,經驗證只有有限組解,其中使得(a,b,|a-b|)滿足Q5的..沒有.


大堆文字不想看的快過來,直接看最下面的圖啊!

看到題目了於是興沖沖想來寫答案,沒想到和 @曾加 大神的重了,(*  ̄︿ ̄),不開森~ 算了,補一張圖吧~ 順便回答一下 @楊海洋 同學的疑問。

具體不用多說,曾加已經說的很詳細了。這裡綠色是能整除144的,灰色是不能整除144的。關於你說的那個2:7:9的,C的心理活動是這樣的:

A是32,B是112,我要麼是80,要麼是144。我如果是80的話,B剛才應該就會說,自己是112,因為B會想:「A是32,C是80,我要麼是112,要麼是48,我如果是48的話,那在上一輪C就會說出他是80了,因為C會想:「A是32,B是48,我要麼是80,要麼是16,我要是16的話,剛才B就會肯定地說自己是48了,因為B會想:「A是32,C是16,我要麼是16,要麼是48,我要是16的話,特么A早就贏了,所以我肯定不是16,是48沒錯」,(C接著想):呵呵,這點小聰明能瞞得住我,既然B剛才沒說自己是48,那我就不是16而是80。」(B接著想):嘿嘿,C這小子的想法完全在我的掌控之中,既然C上一輪沒說自己是80,那我就不是48,而是112。」 (C接著想:)剛才我的一套推理堪稱完美,我真的是80的話,B就能夠根據我上一輪沒猜出自己是80而猜出他自己是112了,而且肯定還在沾沾自喜猜透了我的想法,但是看他現在愁眉苦臉的樣子,看樣子我不是80,而是144。嗯,就醬~

C:老師老師!我知道了…… 今晚有什麼獎勵給我嘛?&<(?????)&>

教授:來來來~ 都把腦門伸過來,我們再換張紙條啊~

A、B、C:(/= _ =)/~┴┴ (/"≡ _ ≡)/~┴┴ (╯‵□′)╯︵┻━┻

------------------------------------------------------------分割線---------------------------------------------------------

補一些直觀的圖:

(1)2階解法之一:

(2)2階解法之二:

(3)3階解法:

(4)4階解法之一:

(5)4階解法之二:


一個教授邏輯學的教授,有三個普通學生
一天教授給他們出了一個題,教授在每個人腦門上貼了一張紙條並告訴他們,每個人的紙條上都寫了一個正整數,且某兩個數的和等於第三個!(每個人可以看見另兩個數,但看不見自己的)
教授問第一個學生:你能猜出自己的數嗎?回答:不能
問第二個,不能
第三個,不能
再問第一個,老師你剛剛問過我一遍了...


第一次回復, 私以為第一的答案有誤, 歡迎討論

第一答主的解答是通過數學模型推導而來, 之所以這道題是邏輯題而不是數學題,
我認為是因為需要考慮到實際情況, 以答主(2:7:9)的答案為例,
假設A看到另外兩個人頭上的數字為7和9
那麼他 不用推導 都能排除掉(2:1:1),(2:3:1),(2:3:5)等等的可能性,
因為自身的數字只有
2和16兩種情況, 而這兩種情況, 都不能滿足上述答案的比值,
那請問答主, 您又如何能從第一個人說不知道僅僅推導出不是(2:1:1)這個比值呢?
第一個人說不知道難道不是什麼都無法證明嗎? 因為(2 : 1 : 1)這個比值不成立, 無需證明

補充:
我認為, 該題須有一個數是另外一個數的整數倍, 即比值應為( 1 : X : X)或( X : 1 : X) ,(X : X : 1)
才可以真實的進行這個測試, 不然, 第一步都無法進行, 也就是, 問到第一個非常聰明孩子就會說
"永遠也猜測不出來, 無需進行下去了"


從A人猜不到只能推出B和c不一樣。
B猜不到說明A和c不一樣,且A不是c的兩倍
c猜不到說明A和B不一樣。A不是B的兩倍兩倍,B也不是A的兩倍。
第二輪A還猜不到就說明C不是B的兩倍或二分之一
B還猜不到就同上
C猜到了自己是144是因為A和B的差或和不滿足上述的其中一個結論。和肯定是滿足上述結論的。就是說A和B的差不滿足上述關於C的結論。A和B的差是A或B的2倍。又A和B的和是144。推的另外兩個人是36和108。


膜拜下第一的那個答案。我自己雖然有點思路但是做推論的時候腦子短路了,最後看了人家的才懂。下面跑個題試試證明下所有的(a, b, a+b)都能通過這種方式推出答案(好像真的跑題挺遠)。

由於問題具有對稱性,所以無所謂三個人從誰開始誰的值是哪個,只要證明對任意正整數值對(a,b)命題成立即可。並且這裡的a,b沒有公約數(有公約數的情況等同於約分後的情況,因為反正能看到別人卡片的數值,乘一下都一樣)。

那麼對任意這樣的值對(a,b),(a!=b,否則除非a和b都是1不然它們就有公約數了)只要值對(a-b,b)能構被推出,那麼(a,b)也能被推出。這一步結論是根據 @曾加 的計算過程。這裡由於a和b不相等,我們可以假設a&>b(否則反正交換下順序就成了)。

那麼(a-b,b)也是沒有公約數的正整數值對。因為假如(a-b,b)有公約數p,那(a,b)也有公約數p。(當然這裡面討論的公約數都不是1)

那麼我們重複上面的過程,大的減小的,最後一定能得到值對(1,1)。反證這一結論:如果不能得到(1,1),那麼我們假設最後得到的是(i,k),其中i和k至少有一個不是1;並且i!=k,否則與(i,k)沒有公約數矛盾。那麼我們仍可以用i、k中的大的減小的,與假設矛盾。

最後,由於(1,1)這一值對是能被推出來的(因為(1:1:2)可在第一輪推斷出來),所以任意值對(a,b)都能通過這種方式被推斷出來。

------
誒,數學太渣了,感覺證得好啰嗦QAQ
嘿嘿,知乎首答案。會有人理嗎。。


端腦進化版?


表示懷疑,為什麼答案只有五種?72+72=144為什麼不行。私以為教授給出的正是72+72=144.當A和B看到72和144的時候肯定猜不出自己的,當C看到有兩個72的時候,自己肯定是144,因為不可能有人是0。這也是為什麼教授要強調正整數。


1.首先聲明,最終答案還沒有搞定,只能先推演一部分,有機會再更新吧。
2.感謝 @曾加答案提供思路,個人只是情景模擬。
3.推演過程描述用的是假設然後排除,可能有些混亂,大家多包涵。

一直搞不懂為什麼會有分界線

一個陽光明媚的早晨,唐僧師徒4人閑著無聊,在去女兒國的路上玩起了遊戲!
唐長老在仨徒弟每個人腦門上貼了一張紙條並告訴他們,每個人的紙條上都寫了一個正整數,且某兩個數的和等於第三個!(每個人可以看見另兩個數,但看不見自己的)
教授問悟空:你能猜出自己的數嗎?回答:不能
八戒,不能
沙僧,不能
再問悟空,不能
八戒,不能
沙僧:我猜出來了,是144!
唐長老很滿意的笑了,於是猴子去摘桃,八戒去化齋,沙僧留下來看行李。。。

根據已有的答案,分別為以下5組(36,108,144)(108,36,144)(54,90,144)(64,80,144)(32,112,144)
一(36,108,144)唐僧:你能猜出自己的數嗎?
悟空此時心情很鬱悶(以後會更鬱悶):獃子是108,傻子是144,我可能是36和252,啥情報都沒有,怎麼玩,和尚就是偏心。於是答道:不能
八戒有點走神:猴哥36,老沙144,我的選擇有108和180,數都差不多。。。到底是選翠蘭妹妹還是嫦娥姐姐呢?於是回答:不能
沙僧此時柯南附體:A=36,B=108,C=72 or 144 ; if C=72 A無法選擇正常,B看到72和36後可判斷B非36(不等於號怎麼打。。。)得出B=108的答案,但是沒有,不成立,排除。所以C=144。於是回答:我猜出來了,是144.
唐僧:恭喜你!都學會搶答了!。。。猴子,你拿個盒子嘀咕什麼波若波羅密。。。

二(108,36,144)回到5分鐘之前的唐僧:你能猜出自己的數嗎?
跟一的推演基本一致,只不過將A,B換下位置,又搶答了。。。波若波羅密。。。

三(54,90,144)又回到5分鐘之前的唐僧:你能猜出自己的數嗎?
悟空繼續鬱悶(第一個回答的總是沒有任何信息提示,悲催)
八戒繼續走神(翠蘭和嫦娥確實不好選)
沙僧繼續附體:A=54,B=90,C=36 or 144 ;if C=36 A無法選擇,B思考:B=18 or 90,if B=18 A看到的是18和36,能推斷出自己為54,就會給出答案,B=18不成立,所以B=90,但B也沒有給出答案,C=36不成立,排除。所以C=144.。於是回答:我猜出來了,是144
唐僧:恭喜你,雖然思考時間長了點,但還是搶答了。。。波若波羅密。。。

先更到這裡,後面的推演會更長,假設也更多,還沒有搞清楚,只能慢慢來了。


發現已經有人發了解法。。嗯和大家的大概差不多。。感覺自己腦子還能用。棒棒噠~
第一次用了順推,和手寫君方法一樣。後來又試著逆推,發現正好是最高票的答案。
決定還是寫下自己的思路。盡量寫得比最高票更易懂。

設三個人為ABC,三個人對應的數字為abc,教授問的順序是A1 B1 C1 A2 B2 C2最後C2猜出。(簡單起見,Xn表示X在第n輪)
首先思考,在什麼情況下一個人能猜出他的數字。
這個不難,很容易想到,當三個人的數字是(2,1,1)時,A會知道自己是2。
因為,根據規則他只能是(2,1,1)或(0,1,1),而(0,1,1)是不可能的。
再拓展一下思維,你可能會想到,(2,1,1)顯然不是這題的正確答案,因為若是(2,1,1),A1即可猜出,根本不用等到C2。
我們由此開始。
很容易發現,每個人在猜自己的數字的時候有兩種可能,比如對於A,這組數可能是X(b+c,b,c)和Y(|b-c|,b,c)。
當XY都有可能時,他無法猜出。當只有一種可能時,答案就顯而易見了。
對於A來說,XY是一對結果,並且只要知道其中一個,便可得知另外一個。
比如我們知道(0,1,1)是不可能的結果,那麼我們可以知道與它對應的(2,1,1)便是正解(能讓A猜出的數組)。

現在我們從A1開始
若A1猜出,已知(0,1,1)不存在,則(2,1,1)是可能的組合。
若B1猜出,已知(1,0,1)不存在,同時(2,1,1)也是不可能的(因為在B1之前就會被A1猜出)。所以答案為(1,2,1)(2,3,1)兩組。
(看到了嗎?(2,1,1)和(2,3,1)是對應的一組數,一個是(2,2-1,1)另一個是(2,2+1,1))
若C1猜出,排除(1,1,0),A1的解【(2,1,1)】B1的解【(1,2,1)和(2,3,1)】。答案為這四組數分別對應的數組,即(1,1,2)(2,1,3)(1,2,3)(2,3,5)

若A2猜出,聰明的他知道,既然A1,B1,C1都沒有猜出,那麼能讓A1 ,B1,C1猜出的組合都不會是正確答案。(舉個例子,若A看到b=2,c=3,那麼可能是(1,2,3)或(5,2,3),但若是(1,2,3),C1就會猜出,所以只能是(5,2,3))
來看由於會被提前猜出而排除的那些組合對應的數組:
被A1猜出的:(2,1,1)→(0,1,1)(X)
被B1猜出的:(1,2,1)→(3,2,1)
(2,3,1)→(4,3,1)
被C1猜出的:(1,1,2)→(3,1,2)
(2,1,3)→(4,1,3)
(1,2,3)→(5,2,3)
(2,3,5)→(8,3,5)
所以,A1B1C1都未猜出,而A2猜出的組合有以上7個。
接下來同理,
若是B2猜出,則是A1B1C1A2的解所對應的數組。注意到有一些對子如(2,1,1)和(2,3,1)兩個都被排除了,那麼顯然不是正解。
B2猜出的答案組合為:
(A1B1對應的都已被排除,答案從C1開始。要注意,一組數對應的那個數組對於A和對於B是不同的,推導的時候不要亂。比如(1,2,3)對於A來說對應的是(5,2,3),對於B來說對應的是(1,4,3))
(1,3,2)(2,5,3)(1,4,3)(2,7,5)(3,4,1)(4,5,1)(3,5,2)(4,7,3)(5,8,3)(8,13,5)


若是C2猜出,(這裡直接給出答案,若是到這看官還不能自行推理。。。。容我先去吐兩口血)
(3,2,5)(4,3,7)(3,1,4)(4,1,5)(5,2,7)(8,3,11)(1,3,4)(2,5,7)(1,4,5)(2,7,9)(3,4,7)(4,5,9)(3,5,8)(4,7,11)(5,8,13)(8,13,21)

終於到了最後的步驟。
其實基礎組合(2,1,1)代表的是三個數的比例,即若你看到另兩個人是k,你自己的數字就是2k,所以其實是(2k,k,k),上面所有的數組都是同理。
對於一個組合(x,y,z),三個數實際上是(xk,yk,zk)。C猜出的數字為144,即zk=144。所以z需要能整除144。
所有這些組合中,只有加下劃線的5組可以:
(3,2,5)(4,3,7)(3,1,4)(4,1,5)(5,2,7)(8,3,11)(1,3,4)(2,5,7)(1,4,5)(2,7,9)(3,4,7)(4,5,9)(3,5,8)(4,7,11)(5,8,13)(8,13,21)


然後就是按比例放大,使C=144。最終結果為:
(108,36,144)(36,108,144)(32,112,144)(64,80,144)(54,90,144)


算了一下用了一個小時左右。結果分別是
108-36-144#
36-108-144#
54-90-144#
32-112-144#
64-90-144#
先說思路,這種題中假定他們都很聰明的意思是他們之間的推論都是共享的。
我們先根據回答問題的先後順序設他們分別為ABC,先以A的角度來看,bc的值肯定不想等,如若相等,a會立即給出答案。
輪到b思考,a和c的值肯定不想等,且ac之比不能為2:1,如若不滿足,B也會立即給出答案。
以此類推我們發現了一個規律,就是當一個人X思考時,X可以由前面的兩個人的限定條件推出自己當前回合的限定條件,如果當前回合沒有出現滿足這些限定條件的數字比,那麼就說不知道。
直到C說了自己是144才結束,也就是說另外兩個人的數字比在C的最後一回合的限定條件中,那我們就篩選出符合條件的數字比,一共5組。
以下是我的推導過程中的各個回合的限定條件
第一回合
A 的限定條件,結果以(B:C)形式給出
1:1

B的限定條件,結果以(A:C)形式給出
1:1 2:1

C的限定條件,結果以(A:B)形式給出
1:1 2:1 1:2 2:3

第二回合
A 的限定條件,結果以(B--C)形式給出
1--2 2--1 3--1 1--3 2--3 3--5

B的限定條件,結果以(A--C)形式給出
1--2 2--3 1--3 2--5 3--2 3--1 4--1 4--3
5--3 8--5

C的限定條件,結果以(A--B)形式給出
3--1 3--2 4--3 4--1 4--5 5--8 8--13
5--2 8--3 1--3 2--5 4--7 1--4 2--7
3--5 3--4


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

邏輯分析:

假設三人的數按順序分別為A、B、C,題意大前提——A、B、C&>0,三者中其中一個為另外兩者之和

每個人的數有另外兩者「和」和「差」兩種可能,排除其中一種就可確定自己的數,從A開始根據前提首先可以確定如果B=C,則A=B-C=0的情況排除,到B時發現A沒能確定,補充得到B≠C這個前提,結合大前提(對A+B=C和A+C=B以及ABC&>0無影響)推出新的條件:

由於B≠C,當A=B+C時,A≠2C且A≠2B,即:

當A=2C(B可用條件),A≠B+C,B=A+C=3C

或當A=2B( C可用條件),A≠B+C,C=A+B=3B

新的條件仍然是否定了「差」的情況而確定,而隨著新的條件被驗證不成立後成為了前提,又能得到更高級的條件,這種遞推驗證是有邏輯的,假設每個條件左、右邊係數分為x、y,左右元分別為p、t,第三元為c則根據 x*p≠y*t 的前提推出的條件為:

當c=p+t時,c≠[(y/x)+1]t且c≠[(x/y)+1]p,即

當x*c=(y+x)*t(p可用條件),c≠p+t,p=c+t

或當y*c=(y+x)*p(t可用條件),c≠p+t,t=c+p

最後C在第二輪通過某個自己可用的條件確定自己是A與B的「和」,這裡可知A,B&<144,有耐心根據邏輯逐一推出各個輪次可用的條件如下表

輪次 條件(格式:「條件等級+條件前元+使用元」x條件前元=y條件後元)


1-a

0CA 1C=1B

1-b

1AB 1A=2C

0AB 1A=1C

1-c

1AC 1A=2B

2BC 2B=3A

1BC 1B=2A

0BC 1B=1A

2-a

2BA 1B=3C

1BA 1B=2C

2CA 1C=3B

3CA 3C=5B

2CA 2C=3B

1CA 1C=2B

2-b

2CB 2C=3A

3CB 2C=5A

2CB 1C=3A

1CB 1C=2A

3AB 1A=4C

2AB 1A=3C

3AB 3A=4C

4AB 5A=8C

3AB 3A=5C

2AB 2A=3C

2-c

3AC 3A=4B

2AC 2A=3B

3AC 1A=4B

4AC 3A=8B

3AC 2A=5B

2AC 1A=3B

3BC 2B=5A

4BC 2B=7A

3BC 1B=4A

2BC 1B=3A

4BC 4B=5A

3BC 3B=4A

4BC 4B=7A

5BC 8B=13A

4BC 5B=8A

3BC 3B=5A


表是通過程序導出來的(這個題可以通過熟悉的計算機語言編程計算),根據2-c的條件代入C=144排除a,b非整數的情況可以確定五組答案

答案1:32 112
144 2B=7A

答案2:36 108
144 B=3A

答案3:54 90
144 3B=5A

答案4:64 80
144 4B=5A

答案5:108 36
144 A=3B

通過PB編程(PB的語言環境確實很不適合做演算法,做的過程中問題很多,很曲折費腦,但很鍛煉邏輯能力和思維)

主要

根據條件遞推的邏輯定義出結構體cdt並聲明為數組來裝載條件,各參數類型如圖

結構體answer聲明為數組裝載答案(程序中直接用消息提示框顯示答案了)

int
i,j,k,li_p,li_t,li_u,ld_arr[]

string
ls_c,ls_p,ls_t

answer
answer[]

cdt
cdt[],cdt0[]

ld_arr[67]=144

for
k=1 to 143 //
一級循環:不斷給定a、b的值來找到符合要求的答案

ld_arr[65]=k

ld_arr[66]=ld_arr[67]-k

cdt[]=cdt0[]

for
i=1 to 6 //
二級循環:按輪次檢驗條件並推出新條件

ls_c=char(65+mod(i - 1,3)) //獲得當前執行的元、理論前元、後元

ls_p=char(65+mod(i+1,3))

ls_t=char(65+mod(i,3))

if i&<4 then //按輪次分別放入三個初始條件

li_u=upperbound(cdt)+1

cdt[li_u].lv=0

cdt[li_u].t=ls_t

cdt[li_u].p=ls_p

cdt[li_u].y=1

cdt[li_u].x=1

cdt[li_u].c=ls_c

cdt[li_u].n=0

end if

//由當前元新推出的條件不會參與該輪次條件循環,故直接用upperbound獲得cdt[]里的條件總數作為循環終值

for j=1 to upperbound(cdt) //對未驗證條件進行驗證,不通過的推導出下一級條件

if
cdt[j].c=ls_c and cdt[j].n=0 then //
判斷條件使用元是否符合當前執行的元且未驗證過


cdt[j].n=i //
記錄條件使用的輪次,同時標記為已驗證過條件


li_p=asc(cdt[j].p)

li_t=asc(cdt[j].t)

if
(cdt[j].x)*ld_arr[li_p]=(cdt[j].y)*ld_arr[li_t] then //
條件驗證,如通過驗證,不論是不是正確答案都直接進行下一個一級循環

if i=6 then //判斷是否是最後一輪次結束

//記錄答案(任意一組答案只可能滿足一個條件)

li_u=upperbound(answer)+1

answer[li_u].a=ld_arr[65]

answer[li_u].b=ld_arr[66]

answer[li_u].c=ld_arr[67]


answer[li_u].ac= string(cdt[j].x)+cdt[j].p + "=" + string(cdt[j].y) +
cdt[j].t

messagebox("答案"+string(li_u),string(answer[li_u].a) +" "+ string(answer[li_u].b) +" "+ string(answer[li_u].c) +" "+ answer[li_u].ac) //得到一組答案時直接顯示

end if

goto nexti //直接跳到下一個一級循環

else //判斷不成立的條件即成為前提,用來推導下一級條件


li_u=upperbound(cdt)+1

if i=5 then //第5輪即2-b輪時只推出c用的條件,a用的條件要在3-a用,2-c就結束了

//根據條件遞推的邏輯,給兩分支的條件各參數賦值

if ls_t=cdt[j].t then

cdt[li_u].n=0;
cdt[li_u].lv=(cdt[j].lv+1); cdt[li_u].p=ls_c; cdt[li_u].c=cdt[j].t ;
cdt[li_u].t=cdt[j].p ; cdt[li_u].x=cdt[j].y ; cdt[li_u].y=cdt[j].y+cdt[j].x

else


cdt[li_u].n=0;
cdt[li_u].lv=(cdt[j].lv+1); cdt[li_u].p=ls_c; cdt[li_u].c=cdt[j].p ;
cdt[li_u].t=cdt[j].t ; cdt[li_u].x=cdt[j].x ; cdt[li_u].y=cdt[j].y+cdt[j].x

end if

elseif i&<5 then


cdt[li_u].n=0; cdt[li_u].lv=(cdt[j].lv+1); cdt[li_u].p=ls_c;
cdt[li_u].c=cdt[j].t ; cdt[li_u].t=cdt[j].p ; cdt[li_u].x=cdt[j].y ;
cdt[li_u].y=cdt[j].y+cdt[j].x


li_u=upperbound(cdt)+1


cdt[li_u].n=0; cdt[li_u].lv=(cdt[j].lv+1); cdt[li_u].p=ls_c; cdt[li_u].c=cdt[j].p
; cdt[li_u].t=cdt[j].t ; cdt[li_u].x=cdt[j].x ; cdt[li_u].y=cdt[j].y+cdt[j].x

end if

end if


end if

next

next

nexti:

next

messagebox("",string(upperbound(cdt))) //顯示用到的條件總數

//以下程序將所有調節按使用輪次列出到單行編輯框的文本sle_1.text中

string
ls_text,ls_cdt[]

int
li_n

for
k=1 to 6

li_n=0

for i=1 to upperbound(cdt)

if cdt[i].n=k then

ls_cdt[k]=ls_cdt[k]+string(cdt[i].lv) +
cdt[i].p + cdt[i].c+" " +string(cdt[i].x)+ cdt[i].p + "=" + string(cdt[i].y) +
cdt[i].t+" "

li_n=li_n+1

end if

next

messagebox("",string(li_n)) // 顯示各輪次可用條件數

ls_text=ls_text+ls_cdt[k]+"~r~n"

next

sle_1.text=ls_text


貼我2007年的解答,錯別字就不改了
bert:關鍵是推理與反證,答案絕不止一種。

Update:碼農,!=這兩符號在一起是不等於

就當這三個人是老大、老二、老三。頭上的真實數字分別是a、b、c;

第一輪分析:

第一步得出:b!=c;(b不等於c)

第二: a!=c, a!=2c

第三部:a!=b, a!=2b, b!=2a

第二輪分析:

第一步:c!=2b, b!=2c

第二步 c!=2a,c!=3a,a!=3c;

最後一步,關鍵的來了:

老三想,如果我是a-b,(目的是要推出矛盾。。嘗試否定a-b)

則老二就認為自己是b或者2a-b(的絕對值)

下面捏造矛盾:

若讓老二猜出他的數字,則有

|2a-b| = 2|a-b| ----------&>等式1

或者

2|2a-b| = |a-b| -----------&>等式2

等式1得到4a=3b;無整數解

等式2可以得到: b=3a或者3b=5a;

因為這種情況下老二可以猜出來,而事實上他沒有猜出來,所以聰明的老三排除了這種情況,知道自己是兩數之和。

同理也可以捏造讓老大猜出數字的矛盾。得出的結果相似,只是老大老二數字換一下。

所以a、b是36與108,或者是54與90.順序任意。


推薦閱讀:

為什麼崔永元到了美國實地調查也不願意相信美國人在吃轉基因食物?
聽INFJ講邏輯是一種什麼樣的體驗?
如何反駁魯迅關於「國民性」的說法?
關於希爾伯特旅館的疑問?

TAG:數學 | 邏輯 |