Python3暴力解题,计算鬼谷子猜数问题

这题是我看小说的时候,作者在小说文中提到的,原题是这样的:

鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。庞涓很有自信的对孙膑说:虽然我不知到这两个数是什么,但我知道你一定也不知道。随后,孙膑说:那我知道了。庞涓说:那我也知道了。

问这两个数是什么?

没看答案的时候,感觉无从下手,不知道怎么解。从网上搜了一下答案,才明白题干怎么提取出来的。
关键一句在于“我知道你一定也不知道”,很像当年百度的广告词是吧~
其实这句说的就是,“孙膑你那边的两数的乘积肯定不唯一”,延展意思是“我这边没有这些俩双数乘积唯一的两数之和”。
看懂了这个之后,后面的就没看了,(答案比较繁琐,忙着看小说,没细看,有兴趣的自行搜索研究)。
人生苦短,我用python,暴力的解了一下这个题:


import itertools
import math

# 全部
a = range(2,100)
# # 质数
# b = list(filter(lambda x: not [x%i for i in range(2, int(math.sqrt(x))+1) if x%i ==0], range(2,100+1)))

# 所有可能组合
c = [i for i in itertools.combinations(a, 2)]
print('所有可能的两个数字组合,共%d项'%len(c))


# 庞涓:我肯定你不知道
times = [i[0]*i[1] for i in c]
temp = []
for i in range(len(times)):
    if times.count(times[i])==1:
        temp.append(c[i])
print('先求出项目相乘得到的乘数唯一的可能,共%d项'%len(temp))

temp2 = set([sum(i) for i in temp])
print('计算这些唯一项的和,得到和数共有%d种'%len(temp2))

temp3 = []
for i in c:
    if sum(i) not in temp2:
        temp3.append(i)
c = temp3
print('因为肯定不唯一,所以和数一定不在上述和数当中,剔除后剩余项%d项'%len(c))


# 庞涓:我不知道(和数不唯一)
plus = [i[0]+i[1] for i in c]
temp = []
for i in range(len(c)):
    if plus.count(plus[i])!=1:
        temp.append(c[i])
c = temp
print('项目相加得到的和数不唯一,剩余项%d项'%len(c))

# 孙膑:听你一说所现在知道了(乘数唯一)
times = [i[0]*i[1] for i in c]
temp = []
for i in range(len(c)):
    if times.count(times[i])==1:
        temp.append(c[i])
c = temp
print('两数相乘答案唯一,剩余项%d项'%len(c))

# 庞涓:我也知道了(和数唯一)
plus = [i[0]+i[1] for i in c]
temp = []
for i in range(len(c)):
    if plus.count(plus[i])==1:
        temp.append(c[i])
c = temp
print('两数相加答案唯一,剩余项%d项'%len(c))

print(c)

得到答案:

所有可能的两个数字组合,共4753项
先求出项目相乘得到的乘数唯一的可能,共1732项
计算这些唯一项的和,得到和数共有183种
因为肯定不唯一,所以和数一定不在上述和数当中,剔除后剩余项145项
项目相加得到的和数不唯一,剩余项145项
两数相乘答案唯一,剩余项86项
两数相加答案唯一,剩余项1项
[(4, 13)]
[Finished in 0.4s]

打完收工,接着看小说

猜你喜欢

转载自blog.csdn.net/watfe/article/details/80905028