三女儿年龄 Python实现


'''
某公司的两位科学家(甲、乙)去吃饭,
坐在一家酒店靠近街道的窗口座位吃饭,
在等待上菜的过程中,闲极无聊,
甲向乙出了一道猜三个女儿年龄的题目。

甲:我有3个女儿,3人年龄之积等于36; 
乙:猜不出来; 
甲:3个女儿年龄之和等于街道上的行人数; 
乙:还是无法确定; 
甲:我的大女儿叫苏珊。 
乙:哦,我知道了。

请问,甲的3个女儿年龄各是多少?
'''

#定义一个年龄集
#因为0岁还没出生,所有从1开始
#因为 “我有3个女儿,3人年龄之积等于36” 所以最大就是36
ageList = list(range(1,37)) 


ageGroup = [] #用来保存所有组合
sumGroup = []

def getAgeGroup(x, y, z):
    '''计算所有乘积等于36的组合'''
    temp = []
    if x * y * z == 36:
        temp.append(x)
        temp.append(y)
        temp.append(z)
        #对组合排序。[1,1,2] [2,1,1],[1,2,1],这三中组合我们认为是一种,
        #因为我们不关心三个女儿站的位置
        temp.sort() 
        #对排序后的组合去重
        if temp not in ageGroup:
            ageGroup.append(temp)


def getSum():
    '''
    甲:3个女儿年龄之和等于街道上的行人数; 
    乙:还是无法确定;
    这段对话可以看出,在组合中有“年龄和”相同的情况
    '''
    tempList = [] #用来保存所有年龄和
    for temp in ageGroup:
        tempList.append(sum(temp))
    #获取所有年龄和中重复的数
    for a in tempList:
        findCount = tempList.count(a)
        #如果出现一次以上,我们得到该数字,并将重复的去掉
        if findCount > 1:
            tempList.remove(a)
            #查看当年龄之和有重复的组合
            for item in ageGroup:
                if sum(item) == a:
                    '''
                    甲:我的大女儿叫苏珊。 
                    乙:哦,我知道了。
                    从这段话得到,它有个大女儿(即年龄大的,肯定不是双胞胎。)
                    '''
                    #在组合中查看最大值唯一的情况
                    if item.count(max(item)) == 1:
                        print(item)

if __name__=='__main__':
    for p1 in ageList:
        for p2 in ageList:
            for p3 in ageList:
                getAgeGroup(p1, p2, p3)
    getSum() # 2, 2, 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值