解S先生与P先生谜题,s先生谜题,Python语言: 解S
Python语言: 解S先生与P先生谜题#设有两个自然数X、Y,2<=X<=Y<=99,#S先生知道这两个数的和S,#P先生知道这两个数的积P,#他们二人进行了如下对话:#* S:我确信你不知道这两个数是什么,但我也不知道。#* P: 一听你说这句话,我就知道这两个数是什么了。#* S: 我也是,现在我也知道了。#现在你能通过他们的会话推断出这两个数是什么吗?#(当然,S和P先生都是非常聪明的)from math import sqrtMIN, MAX = 2, 99#只需要判断y的范围, 程序确保x的取值范围def BaseCondition(x, y): if y >= MIN and y <= MAX and y >= x: return True return False#S先生的S分析def S(x, y): s = x + y return [(x,s-x) for x in xrange(MIN, s/2+1)]#P先生的P分析def P(x, y): p = x * y return [(x,p/x) for x in xrange(MIN, int(sqrt(p)+1)) if p%x==0 and BaseCondition(x, p/x)]#所有待检查的数据def ToCheck(): return ((x,y) for x in xrange(MIN, MAX+1) for y in xrange(x, MAX+1))#条件1 - S:我确信你不知道这两个数是什么,但我也不知道。def Condition1(x, y): s_sep = S(x, y) if len(s_sep) == 1: return False # S分析唯一 for x1, y1 in s_sep: if len(P(x1, y1)) == 1: return False #P分析唯一 return True#条件2 - P: 一听你说这句话,我就知道这两个数是什么了。def Condition2(x, y): p_sep = [c for c in P(x,y) if c!=(x,y)] #除(x,y)之外的P分析 for item in p_sep: if Condition1(*item): return False #若还有满足条件1的解则失败 return True#条件3 - S: 我也是,现在我也知道了。def Condition3(x, y): s_sep = [c for c in S(x, y) if c!=(x,y)] #除(x,y)之外的S分析 for item in s_sep: if Condition2(*item): return False #若还有满足条件2的解则失败 return True#需要同时满足上面3个条件def Condition(*c): return Condition1(*c) and Condition2(*c) and Condition3(*c)result = (c for c in ToCheck() if Condition(*c))print result.next()#该片段来自于http://byrx.net
评论关闭