欧拉计划 50

来源:互联网 发布:《淘金记》知乎 编辑:程序博客网 时间:2024/04/27 21:59

41这个质数,可以写作6个连续质数之和:

41 = 2 + 3 + 5 + 7 + 11 + 13
这是100以下的最长的和为质数的连续质数序列。

1000以下最长的和为质数的连续质数序列包含21个项,和为953.

找出100万以下的最长的何为质数的连续质数序列之和。

100万以下的哪个质数能够写成最长的连续质数序列?

import mathimport timedef is_prime(x):    """ 是否质数 """    if x == 1:        return False    if x == 2:        return True    assert math.floor(x) == x and x > 0    x_sqrt = int(math.sqrt(x))    l = [2]    l.extend(range(3, x_sqrt + 1, 2))    for i in l:        if x % i == 0:            return False    return Truedef get_primes(n):    """ n以下所有质数集 """    n_set = set(range(3, n, 2))    n_set.add(2)    for i in range(3, n+1, 2):        if i in n_set:            i_set = set(range(i * 2, n, i))            n_set -= i_set    n_list = list(n_set)    n_list.sort()    return n_list     #t0 = time.time()#n = 10 ** 6#prime_list = [2]#prime_list.extend([i for i in range(3, n, 2) if is_prime(i)])#max_len = 1#prime_max_len = 2#for inx, prime in enumerate(prime_list):#    # frist#    for i in range(inx // max_len):#        primes_sum = 0#        for j in range(i, inx):#            primes_sum += prime_list[j]#            if primes_sum >= prime:#                break#        if primes_sum == prime:#            if j - i + 1 > max_len:#                max_len = j - i + 1#                prime_max_len = prime#print(prime_max_len, max_len)#t1 = time.time()#print(t1 - t0)t0 = time.time()n = 10 ** 6prime_list = [2]prime_list.extend([i for i in range(3, n, 2) if is_prime(i)])max_len = 1prime_max_len = 2for inx, prime in enumerate(prime_list):    primes_ele = prime_list[0: max_len]    primes_sum = sum(primes_ele)    for j in range(max_len, inx):        primes_ele.append(prime_list[j])        primes_sum += prime_list[j]        while primes_sum > prime:            if len(primes_ele) <= max_len + 1:                break            primes_sum -= primes_ele[0]            primes_ele.pop(0)        if primes_sum >= prime:            break    if primes_sum == prime:        if len(primes_ele) > max_len:            max_len = len(primes_ele)            prime_max_len = primeprint(prime_max_len, max_len)t1 = time.time()print(t1 - t0)t0 = time.time()n = 10 ** 6prime_list = get_primes(n)max_len = 1prime_max_len = 2for inx, prime in enumerate(prime_list):    primes_ele = prime_list[0: max_len]    primes_sum = sum(primes_ele)    for j in range(max_len, inx):        primes_ele.append(prime_list[j])        primes_sum += prime_list[j]        while primes_sum > prime:            if len(primes_ele) <= max_len + 1:                break            primes_sum -= primes_ele[0]            primes_ele.pop(0)        if primes_sum >= prime:            break    if primes_sum == prime:        if len(primes_ele) > max_len:            max_len = len(primes_ele)            prime_max_len = primeprint(prime_max_len, max_len)t1 = time.time()print(t1 - t0)
0 0