楼主: xiangze
2071 1

[休闲其它] 让人脑子抽筋的逻辑问题 [推广有奖]

  • 1关注
  • 0粉丝

博士生

0%

还不是VIP/贵宾

-

威望
0
论坛币
115 个
通用积分
1.0601
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
483 点
帖子
258
精华
0
在线时间
126 小时
注册时间
2009-9-3
最后登录
2013-11-6

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
某教授给他的三个学生的脑门上各贴了一张纸条,并告诉他们:每个纸条上都写了一个正整数,并且其中两个的和等于第三个!(每个人可以看见另两个数,但看不见自己的)
教授问第一个学生:你能猜出自己的数吗?回答:不能;
问第二个,回答:不能;
问第三个,回答:不能;
再问第一个,仍然回答:不能;
再问第二个,仍然回答:不能;
再问第三个:这次回答:我猜出来了,是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, z[c] = 0, k[a]-k, k[a]+k[c]   
  •         learn(*z)   
  •         z[a], z, z[c] = 0, k[a]+k, k[a]-k[c]   
  •         learn(*z)   

  • for k in knowledge[j:]:   
  •     z[a], z, z[c] = k+k[c], k[c], k   

  • print
    "%dx %dx %dx" % tuple(z)  

#!/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, z[c] = 0, k[a]-k, k[a]+k[c]         learn(*z)         z[a], z, z[c] = 0, k[a]+k, k[a]-k[c]         learn(*z) for k in knowledge[j:]:     z[a], z, z[c] = k+k[c], k[c], k     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}。

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

以上的程序就是根据这种生成不等式的方法写的。就我测试的几个数据来看,似乎所有违反不等式的情况都是出现在两个数之差上。不知道是不是可以证明确实不会出现在两个数之和这种情况上。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:knowledge python Coding RETURN append python 正整数 程序 大学

沙发
mly80880 发表于 2009-12-20 21:52:13 |只看作者 |坛友微信交流群
呵呵  牛人啊

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 06:51