最近小李在看吴军博士的《浪潮之巅》一书,下册书中讲到了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=2
while 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 ,搓搓小手,激动地在浏览器中输入该网址,
但是很遗憾,其结果如下面的熊猫头所说,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。