算法题解:把两个数和告诉A,积告诉B,求这两个数是什么 .
Posted 明立
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题解:把两个数和告诉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
运算结果:
以上是关于算法题解:把两个数和告诉A,积告诉B,求这两个数是什么 .的主要内容,如果未能解决你的问题,请参考以下文章