歐拉計劃 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章