鬼谷子问题

题目

孙膑,庞涓都是鬼谷子的徒弟。

一天鬼谷子出了这道题目:他从2到99中选出两个不同的整数,把积告诉孙膑,把和告诉庞涓。经过一天后,鬼谷子叫来两人问他们能不能猜出这两个数。

庞说:我虽然不能确定这两个数是什么,但是我肯定你也不知道这两个数是什么。

孙说:我本来的确不知道,但是听你这么一说,我现在能够确定这两个数字了。

庞说:既然你这么说,我现在也知道这两个数字是什么了。

请问这两个数字是什么?

使用python求解

采用思维方式与之前的推算老师生日类似,计算量变大了些,所以写个python来求解,代码和解释如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#定义最大最小值
N = 2
M = 99

#定义和、积函数
def he(n,m):
return n+m

def ji(n,m):
return n*m

probably_space_begin = [] #开始的可能空间
probably_ji = [] #可能的积空间
probably_he = [] #可能的和空间

#给可能空间赋值
for i in range(N,M):
for j in range(i+1,M+1):
probably_space_begin.append([(i,j),he(i,j),ji(i,j)])
probably_he.append(he(i,j))

#第一句话
#庞不能确定 ——> 和有两种以上分解方式
probably_space_1 = [i for i in probably_space_begin if probably_he.count(i[1]) >= 2]
#庞说孙也不知道 ——> 和对应的分解的积的结果有两种以上
#先排除积空间中的独立值
probably_ji = [i[2] for i in probably_space_1]
probably_space_alone = [i for i in probably_space_1 if probably_ji.count(i[2]) == 1 ]
probably_space_2 = [i for i in probably_space_1 if i not in probably_space_alone]
#排除积在probably_space_alone中的因子之和的情况
impossible_he = {i[1] for i in probably_space_alone}
probably_space_3 = [i for i in probably_space_2 if i[1] not in impossible_he]

#第二句
#孙知道了——>在probably_space_3中确定积即可得到唯一答案
probably_ji = [i[2] for i in probably_space_3]
probably_space_4 = [i for i in probably_space_3 if probably_ji.count(i[2]) == 1]

#第三句
#庞也知道了——>在probably_space_4中确定和即可得到唯一答案
probably_he = [i[1] for i in probably_space_4]
probably_space_5 = [i for i in probably_space_4 if probably_he.count(i[1]) == 1]

#输出
if len(probably_space_5) == 1:
print("两数分别为:",probably_space_5[0][0])

疑问与分析

写完后运行在2到99范围内答案为4和13,上网查验应该是这个答案,随后发现CSDN知乎上也有使用了python的解法,并指出范围改为3到99结果就会变成13和16.

但我尝试发现本文的程序改为3到99后会无解。比对分析后发现应该是在对第一句话解法上有些偏差。但我觉得两种解法应该是等价的,太菜了找不出bug,有大佬看出问题的可以提示一下。