算法题解:把两个数和告诉A,积告诉B,求这两个数是什么 .

1-20的两个数把和告诉A,积告诉B,

A说不知道是多少,

B也说不知道,

这时A说我知道了,

B接着说我也知道了,

问这两个数是多少?

 

思考这个问题之前,需要先明白三个问题:

问题1.A刚开始为什么说不知道?答案:因为可以组成和的方案有很多

问题2.B刚开始为什么说不知道?答案:因为可以组成积的方案有很多(废话?)不,这给了一条重要信息,两数的积为合数,这样才能有很多的方案

问题3:为什么A比B先知道答案?推测,在A把已知的可以组成和的方案中,突然发现只有一种情况,其两数相乘之积为合数,其余为质数!

综上:得出一个重要结论:在组成和的N种方案中,有且仅有一种方案的乘积为合数(N>1)

解决:A已知和为多少,但我们不知道,所以用遍历。程序如下Python实现:

#方案集A
data=[];
index=0;
#方案集C,方案集B通过条件判断进行筛选
dataAdd=[]
#结果集
dataResult=[]
#1-400内的素数表
pri=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113
     ,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,
     283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397]

#通过索引,判断是否加入到了方案集C中,避免重复加入
def bInDataAdd(ind):
    for dt in dataAdd:
        if dt[0]==ind:
            return True;
            pass
        pass
    return False;
    pass
#获取方案集C中,每种和的结果出现的次数,判定是否有对应的组合方案
def getCountInDataAdd(ind):
    count=0;
    for dt in dataAdd:
        if dt[3]==ind:
            count+=1;
            pass
        pass
    return count;
    pass


#程序开始的地方:
#遍历1-20的组合方案。把所有方案添加多方案集A中,数据结果:[数据索引,第一个数,第二个数,两数和,两数积]
for i in range(1,21):
    for j in range(1,21):
        data.append([index,i,j,(i+j),(i*j)])
        index+=1;
        pass
    pass
#刷选过程
for i in range(0,index):
    for j in range(0,index):
        #判断是否存在相同的和
        if data[i][3] == data[j][3]:
            #如果该方案值没有放入字符集C中且比对的方案不是同一份且两数积为非质数(也就是积为合数)
            if not bInDataAdd(data[j][0]) and (i != j) and (not data[j][4] in pri):
                #把该方案添加至子集C中
                dataAdd.append(data[j])
                pass
            pass
            
        pass
    pass
#判断子集C中,是否存在仅有一种组合的方案,如果有,放入结果集中
for i in range(0,len(dataAdd)):
    if getCountInDataAdd(dataAdd[i][3])==1:
        dataResult.append(dataAdd[i])
        pass
    pass
#打印结果集内容
for dt in dataResult:
    print(dt)
    pass

运算结果:

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页