项目欧拉 37

0 投票
1 回答
1246 浏览
提问于 2025-04-18 03:24

我现在正在尝试解决Project Euler的第37个问题。问题的描述可以在这里找到:

http://projecteuler.net/problem=37

这是我为这个问题写的代码:

def is_prime(n):
    i = 2
    while i<n:
        if(n%i == 0):
            return False
        i+=1
    return True

def left_truncable(num):
    li = []
    x = str(num)
    if(is_prime(num)):
        n = len(x)
        check = ""
        i = 1
        while(i<n):
            if(is_prime(int(x[i:]))):
                check = "True"
                i+=1
            else:
                check = "False"
                break
        if(check == "True"):
            li.append(num)
    return li

def right_truncable(num1):
    ri = []
    x1 = str(num1)
    if(is_prime(num1)):
        n = len(x1)
        check = ""
        j = 1
        while(j<n):
            if(is_prime(int(x1[:j]))):
                check = "True"
                j+=1
            else:
                check = "False"
                break
        if(check == "True"):
            ri.append(num1)
    return ri

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

right = []
for e in range(1, 1000):
    r = right_truncable(e)
    if(r != []):
        right.append(r)


left = []
for f in range(1, 1000):
    l = left_truncable(f)
    if(l != []):
        left.append(l)        

print common_elements(right, left)    

基本上,我创建了一个函数来找出所有的右截断素数和左截断素数。然后我为这两种素数分别做了两个列表,最后找出了这两个列表中的共同元素。不过,我在前1000个数字中找到了超过11个截断素数。以下是我运行这段代码后得到的输出:

[[11], [13], [17], [23], [31], [37], [53], [71], [73], [113], [131], [137], [173], [197], [311], [313], [317], [373], [797]]

我的代码到底出了什么问题呢?

1 个回答

5

1 不是一个质数,所以像 11、31、71、131 这样的数字不能从左到右截断。

撰写回答