欧拉计划 51

通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83。

通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,
得到的质数是:56003, 56113, 56333, 56443, 56663, 56773, 和 56993。
因此其中最小的56003就是具有这个性质的最小的质数。

找出最小的质数,通过用同样的数字置换其中的一部分(不一定是相邻的部分),能够得到八个质数。

import math
import time


def is_prime(x):
    """ 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


def get_digit(x):
    """ x各位上的数 """
    digit = []
    while x:
        digit.append(x % 10)
        x = x // 10
    digit.reverse()
    return digit


def get_digit_loc(digit):
    """ digit位数可置换方案 """
    digit_loc = []
    d = [0] * digit
    for _ in range(2 ** digit - 2):
        add_in = 0
        d[0] += 1
        for j in range(digit):
            d[j] += add_in
            if d[j] == 2:
                d[j] = 0
                add_in = 1
            else:
                break
        digit_loc.append(d.copy())
    return digit_loc


t0 = time.time()
num = 11
digit_len = len(str(num))
n = 8
digit_loc = get_digit_loc(digit_len)
while 1:
    if is_prime(num):
        digit_list = get_digit(num)        
        for d in digit_loc:
            same_digit = set([digit_list[i] for i in range(len(d)) if d[i] == 1])
            # 是否为同一数
            if len(same_digit) != 1:
                continue
            n_ = 1
            same_digit_num = same_digit.pop()
            d_ = sum([ele * 10 ** (len(d) - 1 - i) for i, ele in enumerate(d)])
            for i in range(1, 10):
                if same_digit_num + i > 9 or 10 - same_digit_num - i < n - n_:
                    break
                # 相加替换数据
                num_ = num + i * d_
                if is_prime(num_):
                    n_ += 1
            if n_ == n:
                break
        if n_ == n:
            break
    num += 2
    if num >= 10 ** digit_len:
        digit_len += 1
        digit_loc = get_digit_loc(digit_len)
print(num)
t1 = time.time()
print(t1 - t0)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章