欧拉计划 37

来源:互联网 发布:学生网络诈骗事例 编辑:程序博客网 时间:2024/06/06 05:18

3797这个数很有趣。它本身是质数,而且如果我们从左边不断地裁去数字,得到的仍然都是质数:3797,797,97,7。
而且我们还可以从右向左裁剪:3797,379,37,3,得到的仍然都是质数。

找出全部11个这样从左向右和从右向左都可以裁剪的质数。

注意:2,3,5和7不被认为是可裁剪的质数。

import mathimport itertoolsdef 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 Truedef is_prime_all(l):    """    左边不断地裁去数字\从右向左裁剪都为质数    """    l_len = len(l)    for i_l in range(l_len):        l_ = l[i_l: ]        if not is_prime(sum([v * 10 ** (len(l_) - 1 - i) for i, v in enumerate(l_)])):            return False        l_ = l[: i_l + 1]        if not is_prime(sum([v * 10 ** (len(l_) - 1 - i) for i, v in enumerate(l_)])):            return False    return Truen_max = 11n = 0digit = 2while n < n_max:    # 首尾只能是质数    for i_digit in [2, 3, 5, 7]:        for i_1 in [3, 7]:            for i_mid in itertools.product([1, 3, 7, 9], repeat=digit-2):                if digit > 2:                    n_list = [i_digit]                    n_list.extend(list(i_mid))                    n_list.append(i_1)                else:                    n_list = [i_digit, i_1]                if is_prime_all(n_list):                    n += 1                    print(sum([n_list[i] * 10 ** (digit - 1 - i) for i in range(digit)]))    digit += 1
0 0
原创粉丝点击