最近小李在看吳軍博士的《浪潮之巔》一書,下冊書中講到了google公司的發展故事,作者用了其14個不為人知或被公眾忽略的側面來描述這個傳奇的公司。而在對google公司的介紹中,一張插圖引起了我的注意,這張插圖是google在101號高速公路旁打的大幅招聘廣告。
這15年前的招聘廣告竟如此有創意,現在火熱得不可開交的表情包等結合高等數學令人耳目一新的創意**可能就是**於此吧~
真是江山代有人才出,乙個更比乙個溜啊!
好了言歸正傳,今天不聊高數題的求解,來聊聊谷歌這道演算法題。題意非常明確,找到自然底數e的第乙個出現的十位連續數字構成的質數。而找到該質數,加上 .com 就可以進到谷歌的招聘**。
那麼如何做呢?首先我們需要求解得到e的較為準確的值,根據e的指數函式的泰勒展開(sorry,還是用到了高等數學的知識),我們可以通過該式取x等於1,從而計算得到e的值,並且n取約大,這個值就越準確。
這裡需要用到階乘的計算,通過簡單的遞迴,設定遞迴出口便可以實現。
def factorial(x):
if x==1:
return 1
else:
return x*factorial(x-1)
但是問題又出現了,int 和 float的精度都不夠,在此小李也投個機取個巧,可以使用 decimal 庫來進行高精度資料的計算。
decimal 完美利用了 「通過借助整數來表示小數的方式」解決了浮點數不精確的問題,提供十進位制資料型別,並且儲存為十進位制數序列。下面這個函式根據泰勒展開式得到了較為精確的e的值。
def get_e(n):
decimal.getcontext().prec=10000
e=decimal.decimal('1.0')
for i in range(1,n):
e =1/decimal.decimal(factorial(i))
print(e)
return str(e)
得到了這個e要找質數之後,我們還需要完成乙個用來判斷質數的函式,這個就非常容易了,其中用了條件 i*i<=x 來減少了求質數的時間複雜度。
def prime(x):
if x<=1:
return false
i=2while i*i<=x:
if x%i==0:
return false
i =1
return true
有了上述的基本準備之後,我們就可以從e的小數點的第一位開始遍歷,每次都取十位進行質數的判斷,在發現第乙個質數之後便退出迴圈。
def find(n):
e=get_e(n)
for i in range(2,len(e)-9):
number=e[i:i 10]
if prime(int(number)):
print(number)
break
由此我們執行該程式便可以得到答案 7427466391 ,搓搓小手,激動地在瀏覽器中輸入該**,
但是很遺憾,其結果如下面的熊貓頭所說,
一年前的今天
2003年10月15日,中國在酒泉衛星發射中心進行首次載人航天發射。9時整,長征 二號f型火箭點火公升空。按計畫,飛船執行在軌道傾角42.4度 近地點高度200公里 遠地點高度350公里的橢圓軌道上,實施變軌後,進入343公里的圓軌道。首位 的中國太空人是來自遼寧的空軍飛行員楊利偉,今年38歲,大學...
一年前的心情 給hxx
xx 在家玩的好嗎?暑假又增加了幾磅啊?開個玩笑 我現在還在南京活著呢 不過tomorrow i will go back home 這幾天在這裡 早晨醒來 陽光直照在臉上 沒有風 人就像裝在袋子裡一般 還有打濕了一半的枕頭 總是指示著10點半的 小新 鬧鐘.傍晚趴在窗台上仰望夕陽殘缺的天空,鳥兒在...
遞迴水題(一年前寫的)
include using namespace std int n,k,i,a 31 void excel voidf int n k表示2的冪次 n n a k n被減到0時結束 if k 0 n 0 printf 2 0 n 0說明不是末尾,則後面還有乙個 號 if k 0 n 0 printf...