欧拉计划 49

1487, 4817, 8147这个序列,每个比前一个递增3330,而且这个序列有两个特点:
1. 序列中的每个数都是质数。
2. 每个四位数都是其他数字的一种排列。

1,2,3位组成的三个质数的序列中没有具有以上性质的。但是还有另外一个四位的递增序列满足这个性质。

如果将这另外一个序列的三个数连接起来,组成的12位数字是多少?

import math
import time


def get_digit_str(x):
    """ 各位数 """
    digit = []
    while x:
        digit.append(x % 10)
        x = x // 10
    digit.sort()
    return str(digit)


def 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 True


t0 = time.time()
prime_dict = dict()
for i in range(1001, 10000, 2):
    if is_prime(i):
        prime_dict.setdefault(get_digit_str(i), []).append(i)
for prime_list in prime_dict.values():
    if len(prime_list) < 3:
        continue
    for i in range(len(prime_list) - 2):
        for j in range(i + 1, len(prime_list) - 1):
            d = prime_list[j] - prime_list[i]
            if prime_list[j] + d in prime_list:
                print(prime_list[i] * 10 ** 8 + prime_list[j] * 10 ** 4 + prime_list[j] + d)    
t1 = time.time()
print(t1 - t0)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值