解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题

解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题,第1张

概述解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

# -*- Coding: utf-8 -*-# 原题:一个老师从2到9中取两个数字,给甲说了和,给乙说了积,# 甲说我不知道,乙说我也不知道,甲说你不知道那我就知道了,# 乙说你知道了那我也知道了# 这两个数分别是多少?# ========================================================# 为了方便表示,记两个数字的组合为字符串i&j,如2&3这种格式# 以下是工具函数# ========================================================# 通过数字i和j生成组合(注意i&j和j&i其实是一样的)def genij(i,j):    return '%d&%d'%(i,j) if i >=j else '%d&%d'%(j,i)# 获得组合的和def add_ij(ij):    v = ij.split('&')    return int(v[0]) + int(v[1])# 获得组合的积def mul_ij(ij):    v = ij.split('&')    return int(v[0]) * int(v[1])# ========================================================# 以下开始计算# ========================================================def find_iJs(begin,end):    end = end + 1    # 生成两个begin-end数字所有可能的和、积    a = {}    b = {}    for i in range(begin,end):        for j in range(begin,end):            v = genij(i,j)            if i+j in a:                a[i+j].add(v)             else:                a[i+j] = set()                a[i+j].add(v)            if i*j in b:                b[i*j].add(v)            else:                b[i*j] = set()                b[i*j].add(v)    # print u'----------两个%d-%d数字和的可能组合a-------------------\n'%(begin,end),a    # print u'----------两个%d-%d数字积的可能组合b-------------------\n'%(begin,b    # 排除和是唯一的组合(如果是唯一,甲第一次就应该知道这两个数字)    a1 = {k: v for k,v in a.items() if len(v) == 1}    a1 = reduce(lambda x,y: x | y,[k for k in a1.values()])     # print u'----------甲第一次不知道后可以排除的组合a1-------------------\n',List(a1)    # 排除积是唯一的组合(如果是唯一,乙第一次就应该知道这两个数字)    b1 = {k: v for k,v in b.items() if len(v) == 1}    b1 = reduce(lambda x,[k for k in b1.values()])     # print u'----------乙第一次不知道后可以排除的组合b1-------------------\n',List(b1)    # 排除a1、b1后剩下的数字组合    c = set()    for i in range(begin,j)            if v not in a1 and v not in b1:                c.add(v)    # print u'----------甲乙第一次不知道后的可能组合c-------------------\n',List(c)    # 甲第二次知道了,是因为他能够排除和为m数字中其他非正确答案的组合    # 那就是说和为m的可能的数字组合除正确答案之外都在不可能的数字组合a1和b1里面    c1 = []    for i in c:        v = add_ij(i)        test = True        for j in a[v]:            if j != i:                if j in c:  # 相当于 if j not in a1 and j not in b1:                    test = False        if test:            c1.append(i)    # print u'----------甲第二次知道后的可能组合c1-------------------\n',c1    # 乙第二次知道了,是因为他能够排除积为n数字中其他非正确答案的组合    # 他的依据是甲既然知道,那么这个数字组合肯定是c1中的一种    # 然后他再根据c1做一下排除,积为n的可能的数字组合除正确答案之外都在不可能的数字组合c1里面    c2 = []    for i in c1:        v = mul_ij(i)        test = True        for j in b[v]:            if j != i:                if j in c1:                    test = False        if test:            c2.append(i)    # print u'----------乙第二次知道后答案c2-------------------\n',c2    return c2for i in range(3,20):    for j in range(2,i):        print '%d-%d'%(j,i),find_iJs(j,i)

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题全部内容,希望文章能够帮你解决解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1198732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存