今天重温了一下互联网时代这部纪录片,看到了google曾经的一个招聘广告。原题目为:{first 10-digit prime found in consecutive digits of e}.com。意思是在常数e的连续数字中找到第一个10位数的质数,记得大一的时候就看到过这个题目,但是由于水平有限,当时没能做的出来,四年过去了,水平自然与当时相比有了较大的提高,那么便来试试这道题。
已知常数e是一个无限不循环的小数,它有多种计算方法,例如:极限计算法(如图1的计算公式),级数展开计算法(图2),积分模拟法(如图3,阴影部分的面积=1),等等。
图 1 图 2 图 3在本次求解的过程中,使用的是第二种方法,即:级数展开计算法。在程序运行时,需要输入三个参数,分别是x(公式中的x),n(要计算到第几项,值越大,精度越高)以及要精确的小数的位数。
运行效果如图4所示(输入的三个参数分别为:1, 1000, 200):
图 4运行结果如图5:
图 5根据计算的结果可以知道,第一个10位的素数为:7427466391(那么很显然google的招聘地址为:7427466391.com。不过现在好像已经不能访问了~_~)。程序会打印出在该有效位数的情况下的所有的10位数的素数,不过我们只看第一个就好啦。
以下是代码(本代码使用了python的decimal库来处理一些高精度数字):
import math;
from decimal import *;
#求n的阶乘
def myfact(n):
if n < 2:
return 1;
else:
return n * myfact(n-1);
#判断n是否为质数
def is_prime(n):
if n == 0 or n == 1:
return False;
q = int(math.sqrt(n))+1;
for i in range(2, q):
if n % i == 0:
return False;
return True;
#程序入口
if __name__ == '__main__':
print "please input x:";
x = input();
print "please input n:";
n = input();
print "please input Decimal point:";
point_n = input();
getcontext().prec = point_n;
result = Decimal('1.0');
for i in range(1, n):
result = result + Decimal(str(pow(x,i))) / Decimal(myfact(i));
print "e = ", result;
str_digit = str(result);
for i in range(2, len(str_digit)-10):
str_a = str_digit[i:i+10];
if is_prime(int(str_a)):
print str_a;
总结:在测试不同的输入参数的过程中,发现当有效位数为100的时候,是不存在10位素数的,当有效位数为120的时候,刚好出现一个素数,那么也就是说常数e的第一个10位的素数介于小数点后100~120位之间。
网友评论