您的位置:首页 > 编程语言 > Python开发

鬼谷分数2-99,和给庞涓,积给孙膑. python 程序实现

2018-03-02 11:05 260 查看
一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,把这两个数的乘积告诉了孙膑,但孙膑和庞涓彼此不知到对方得到的数。 第二天,庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。 随后,孙膑说:那我知道了。 过一会儿,庞涓说:那我也知道了。 这两个数是多少?
程序解法 以python代码为例, jia为庞涓 ,yi为孙膑
list = []
he_dict = {}

ji_dict = {}
#创建所有分类,并计算 每一个he ji  对应的可能组合的个数
for i in range(2,98):
for j in range(i+1,99):
list.append([i,j])
he_dict[i+j] = he_dict.get(i+j,0) + 1
ji_dict[i*j] = ji_dict.get(i*j,0) + 1

## 甲不知道 说乙不知道  甲不知道则说明 对应的he的分类不唯一 
#确认乙也不知道则说明 这个和所有的组合在积上不唯一。 相应的获取he不可能的数。确认和的范围
list_jia_not = set([x[0]+x[1] for x in list if ji_dict[x[0]*x[1]] == 1  or he_dict[x[0]+x[1]] == 1])
list_jia_in = set([x[0] + x[1] for x in list if x[0]+x[1] not in list_jia_not])
## 乙说知道 。 和的范围确认。和所有的分类组成的积为积可能的分类
list_yi_pro = set([x[0] * x[1] for x in list if x[0]+x[1] in list_jia_in])

## 由于乙知道。则积可能的分类组成的和 与 和的范围 交集为1
list_yi_in = set()
for ji in list_yi_pro:
in_jia_set = set([x[0]+x[1] for x in list if x[0]*x[1] == ji])
if len(in_jia_set&list_jia_in) == 1:
list_yi_in.add(ji)
## 甲知道  则和的范围内的的每一个和的分解,对应的积,与积的范围交集为1
find_jia_in = set()
for jia in list_jia_in:
in_yi_set = set([x[0]*x[1] for x in list if x[0]+x[1] == jia])
if len(in_yi_set&list_yi_in) == 1:
find_jia_in.add(jia)
## 和的范围和积的范围均确认,则原始问题确认
final_in = [x for x in list if x[0]+x[1] in find_jia_in and x[0]*x[1] in list_yi_in]
结果[4,13]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  逻辑程序 python 2-99