Python3暴力解題,計算鬼谷子猜數問題
阿新 • • 發佈:2018-12-16
這題是我看小說的時候,作者在小說文中提到的,原題是這樣的:
鬼谷子隨意從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]
打完收工,接著看小說