甲乙两人互猜数字(鬼谷子问题)的逻辑推理与算法建模

本文详细介绍了著名的逻辑推理题“鬼谷子问题”,通过分析与推理,逐步揭示了问题的解决方案。文章首先阐述了问题背景和分析思路,接着通过数据结构与算法对问题进行了建模,最后提供了C++代码实现和复杂度分析。
摘要由CSDN通过智能技术生成

一、问题

这是一道历史悠久,又很困难的逻辑推理题,有的公司还会将其作为面试题。有人将其称为“鬼谷子问题”,但笔者至今没有找到任何可靠来源。先给出问题。

你在旁观主持人和甲、乙两个天才数学家玩猜数字游戏。主持人准备了两个数,告知甲乙:这两个数不同,且大于等于1,小于等于30。然后主持人将两数之积告诉甲,把两数之和告诉乙。甲知道乙拿到两数之和,乙也知道甲拿到两数之积。主持人让甲乙猜这两个数字,让甲先发言。

甲:“我不知道这两个数是什么”

乙:“我也不知道”

甲:“那我知道了”

乙:“那我也知道了”

请问你,这两个数是什么?

 

另一种等价表述(即所谓的鬼谷子问题):

一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。第二天,庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。随后,孙膑说:那我知道了。庞涓说:那我也知道了。

 

网上有不少对这道题的讨论和答案,但几乎都没有准确的推理过程,有些甚至是错误的。本文用尽量清晰的语言给出详细的推理过程,然后给出了计算机建模和程序实现,以及进一步的发散思考。但建议在参阅下面的答案前,先自行认真思考。

 

二、分析与推理

1. 约定

由于推断的逻辑很复杂,所以必须用约定的语言来描述。本文所用的推断名称格式如下:

“1甲n”表示若甲拿到的两数之积为n,第1次发言时做的推断。

“1乙m”表示若乙拿到的两数之和为m,根据甲的第1次发言,乙做出的推断。

“2甲n”表示若甲拿到的两数之积为n,根据乙的第1次发言,甲做出的推断。

“2乙m”表示若乙拿到的两数之和为m,根据甲的第2次发言,乙做出的推断。

前提是甲乙都是天才数学家,因此一定会先假设两个数,然后将自己做为对方进行推断。如果可以推断出,则一定不会失误。

 

推断的书写格式为:

推断名:可能拆分1,结论1;可能拆分2,结论2;……

推断名为红色表示可知推断,即可推断出确切的两个数;绿色表示未知推断,即有多种可能。

 

2. 推理过程

甲说:“我不知道”

下面列出甲拿到的积为2到12的全部情况。(A)若两数之积只有一种拆分的情况下甲会做出已知推断,与甲这次未知的事实不符;(B)若至少有两种可能,则甲做出未知推断,符合甲这次未知的事实。

1甲2:1*2,可知1和2。(A)

1甲3:1*3,可知1和3。(A)

1甲4:1*4,可知1和4。(A)

1甲5:1*5,可知1和5。(A)

1甲6:1*6,2*3。(B)

1甲7:1*7,可知1和7。(A)

1甲8:1*8,2*4。(B)

1甲9:1*9,可知1和9。(A)

1甲10:1*10,2*5。(B)

1甲11:1*11,可知1和11。(A)

1甲12:1*12,2*6,3*4。(B)

以下略,易证得两数之积为素数或素数的平方时为已知推断,否则为未知推断。

乙说:“我也不知道”

1. 对于乙,若两数之和只有一种拆分可能,则乙会做出已知推断,与乙第一次未知的事实不符。

2. 若至少有两种拆分可能,则乙可在假设某一种拆分的情况下,算得两数之积,然后假设自己为甲做出推断,并得到相应的结论:(A)若在假设的某一种拆分的情况下甲会做出已知推断,则该情况与甲第一次未知的事实矛盾;(B)若有且只有一种拆分的情况下甲会做出未知推断,则乙可做出已知推断(就是这种拆分),与乙这次未知的事实矛盾;(C)若有至少两种拆分的情况下甲都会做出未知推断,则乙做出未知推断,符合乙这次未知的事实。

1乙3:1+2,可知1和2。(A)

1乙4:1+3,可知1和3。(A)

1乙5:1+4,则1甲4;2+3,则

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值