Skip to Content

让人脑子抽筋的逻辑问题

labrador 的头像
seeghost from forum.ubuntu.org.cn写道:
某教授给他的三个学生的脑门上各贴了一张纸条,并告诉他们:每个纸条上都写了一个正整数,并且其中两个的和等于第三个!(每个人可以看见另两个数,但看不见自己的)
教授问第一个学生:你能猜出自己的数吗?回答:不能;
问第二个,回答:不能;
问第三个,回答:不能;
再问第一个,仍然回答:不能;
再问第二个,仍然回答:不能;
再问第三个:这次回答:我猜出来了,是144!
下面请问:
第一个学生脑门上的纸条写的是什么数?
这个问题我好像在大学的时候听师兄说过,我把它稍微扩展了一下,写了下面这个python程序,其中变量n用于控制教授问了多少人次。比如就上面这个题目而言,n=6。

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

n = 10 

print "某教授给他的三个学生的脑门上各贴了一张纸条,并告诉他们:每个纸条上都" \ 
    "写了一个正整数,并且其中两个的和等于第三个!(每个人可以看见另两个数," \ 
    "但看不见自己的)教授问第一个学生:你能猜出自己的数吗?回答:", 
for i in range(1, n): 
    print "不能;" 
    print ("再" if i>=3 else "") + "问第" + ("一","二","三")[i % 3] + \ 
        "个,回答:", 
print "我猜出来了!" 
print "请问:这三个数分别是多少?" 
print 
print "答:这三个数可以是下列组合,其中x为任意正整数:" 

knowledge = [(1,0,0), (0,1,0), (0,0,1)] 

def learn(a, b, c): 
    t = [i for i in (a, b, c) if i > 0] 
    if len(t) != 2: 
        return 
    gcd, t = t 
    while t % gcd: 
        gcd, t = t%gcd, gcd 
    t = (a/gcd, b/gcd, c/gcd) 
    if t not in knowledge: 
        knowledge.append(t) 

a, b, c = 2, 0, 1 
z = [0, 0, 0] 
for i in range(n): 
    j = len(knowledge) 
    a, b, c = b, c, a 
    for k in [k for k in knowledge if k[a]]: 
        z[a], z[b], z[c] = 0, k[a]-k[b], k[a]+k[c] 
        learn(*z) 
        z[a], z[b], z[c] = 0, k[a]+k[b], k[a]-k[c] 
        learn(*z) 

for k in knowledge[j:]: 
    z[a], z[b], z[c] = k[b]+k[c], k[c], k[b] 
    print "%dx %dx %dx" % tuple(z)
这个程序的运行结果为
某教授给他的三个学生的脑门上各贴了一张纸条,并告诉他们:每个纸条上都写了一个正整数,并且其中两个的和等于第三个!(每个人可以看见另两个数,但看不见自己的)教授问第一个学生:你能猜出自己的数吗?回答: 不能; 
问第二个,回答: 不能; 
问第三个,回答: 不能; 
再问第一个,回答: 不能; 
再问第二个,回答: 不能; 
再问第三个,回答: 不能; 
再问第一个,回答: 不能; 
再问第二个,回答: 不能; 
再问第三个,回答: 不能; 
再问第一个,回答: 我猜出来了! 
请问:这三个数分别是多少? 

答:这三个数可以是下列组合,其中x为任意正整数: 
13x 8x 5x 
18x 11x 7x 
11x 7x 4x 
14x 9x 5x 
19x 12x 7x 
30x 19x 11x 
9x 5x 4x 
16x 9x 7x 
11x 6x 5x 
20x 11x 9x 
17x 10x 7x 
22x 13x 9x 
19x 11x 8x 
26x 15x 11x 
......
下面简单介绍一下这个题目的解题思路,如果不想被spoil就别往下看了:)

假设这三个学生脑门上的数分别是a,b,c,当第一个学生看到其它两个学生脑门上的数b,c的时候,她知道a只有可能有两种情况b+c或者|b-c|。因为如这个题目中最重要的条件所述,所有数都是正整数,所以a>0;如果b等于c,即|b-c|=0,那么显然a只能等于b+c,这样第一个学生就能知道自己头上是什么数字了,因此,b!=c。

沿着这个逻辑继续往下看,当第二个学生听说第一个学生不知道自己头上数字是什么的时候,她所学习到的不等式组就变成了{a!=0, b!=0, c!=0, b!=c}。因为她也不知道自己头上的数字是什么,那么|a-c|!=0,即a!=c;另外根据b!=c,|a-c|!=c,即a!=2c且a!=0。这样,到第三个学生的时候,不等式组就扩展为{a!=0, b!=0, c!=0, b!=c, a!=c, a!=2c}。

以此类推,直到有一个学生发现其余两个学生头上数之和或者之差中的某一个违反了之前的不等式,她就可以宣布得出了问题的答案。

以上的程序就是根据这种生成不等式的方法写的。就我测试的几个数据来看,似乎所有违反不等式的情况都是出现在两个数之差上。不知道是不是可以证明确实不会出现在两个数之和这种情况上。
#4222
我看了還是不理解。
#4224
似懂非懂...
#6959
{a!=0, b!=0, c!=0, b!=c, a!=c, a!=2c}
这不是一个正确的集合,因为元素重复了:{a!=0, b!=0, c!=0, a!=c, a!=2c}等价于{a!=0, b!=0, c!=0, b!=c, a!=c}
#6960
另外,这是找逻辑分析过程,不是找数的组合

——bro9
#7047
转贴百度上mainzgirl的方法,很厉害的:


哈,我想出个简单的方法,绝对正确:

这三个人的数字分别为x,y,z.
第二个轮回的时候,第三个人想,自己的数字如果是|x-y|的话,那么第二个人就可以推算自己的数字是:|x-y|+x或者||x-y|-x|,只有当其中的一种可能值恰好和第一个人的数字相同时,第二个人才有可能确定自己的数字为另一种可能值(因为第一轮已经推出第一第二个人的数字不可能相同),:
|x-y|+x=x, 得出: x=y(排除)
||x-y|-x|=x, 得出: x=y(排除) or y=3x
也就是说,只有在y=3x的情况下,第二个人才有可能在第二轮确定自己的值,而倘若第二个人在第二个轮回还是无法确定自己的数字的话,第三个人才可以确定自己的数字不是|x-y|,而是|x+y|.
总之,只有当y=3x时,第三个人才能在第二轮询问中确定自己的数字.

y=3x, x+y=144 得出x=36, y=108, z=144
答案应该只有一个!
#11045
一个教授逻辑学的教授,有三个学生,而且三个学生均非常聪明!他们的判断绝对正确!一天教授给他们出了一个题,教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个!(每个人可以看见另两个数,但看不见自己的)
教授问第一个学生:你能猜出自己的数吗?回答:不能,问第二个,不能,第三个,不能;
再问第一个,不能,第二个,不能,第三个:不能;
又问第一个,不能,第二个,不能,第三个:还是不能;
再回头问第一个,不能,第二个,不能,第三个:我猜出来了,是144!请问您能猜出另外两个人的数吗?
注意这里问了12次才得到答案,不是6次!!!!!!!!!!!!!!!!
这道题就更难了!

http://hi.baidu.com/f10ultra/blog/item/f4a665219ffb152d359bf792.html

有答案
#11046
54 90 144
36 108 144
108 36 144
这三种组合都可以!

http://hi.baidu.com/f10ultra/blog/item/f4a665219ffb152d359bf792.html
看详细解

发表新评论

  • 你可以在文本中使用BBCode标记语言。 URL会自动被转为链接。

更多关於格式化选项的信息

CAPTCHA
请验证您是否是机器人。
Image CAPTCHA
Enter the characters shown in the image.