1. 程式人生 > >Python3暴力解題,計算鬼谷子猜數問題

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]

打完收工,接著看小說