first 10-digit prime found in co

2018-10-05  本文已影响290人  还是橘子派

今天重温了一下互联网时代这部纪录片,看到了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位之间。

上一篇 下一篇

猜你喜欢

热点阅读