项目Euler#37的问题

时间:2019-11-21 07:08:36

标签: python performance debugging

我尝试了几种方法来解决Project Euler#37,并编写了代码(我对此进行了背景检查,看起来似乎还不错),但是在问题中它指出只有11种可能的答案我需要总结一下,但我得到30。 问题是:

  

数字3797具有一个有趣的性质。本身就是首要的   可以从左到右连续删除数字并保持不变   每个阶段的质数:3797、797、97和7。类似地,我们可以从   从右到左:3797、379、37和3。

     

找到两个都可以截断的素数的和   从左到右,从右到左。

     

注意:2、3、5和7不被视为可截短的素数。

因此,对于每个素数,我都会遍历其数字len的范围,并将其连接起来以进行检查,然后检查该数字是否也是素数,而我前后进行了此操作。如果它们都是素数,我会附加到结果(原始数字)上并进行总结。

代码如下:

def trunc_primes():
    it_range = range(9, 10000)
    primes = [i for i in it_range if all((i%d)!=0 for d in range(2, i//2))]
    results = []
    counter=0

    for prime in primes:
        splitted = list(str(prime))
        forwards = splitted.copy()
        backwards = splitted[::-1]

        forward_range = range(len(forwards))
        prime_check_dict = {}
        for i in forward_range: prime_check_dict[i]=False

        for fr in forward_range:
            forward = int(''.join(forwards[0+fr:]))
            backward = int(''.join(backwards[0+fr:][::-1])) # reverse back the reversed list

            if all((forward%d)!=0 for d in range(2, forward//2)):
                if all((backward%e)!=0 for e in range(2, backward//2)):
                    prime_check_dict[fr]=True 

        if all(prime_check_dict[i]==True for i in prime_check_dict):
            results.append(prime)
            counter+=1


#here is also some sample background work at the second for loop:

#original:  ['9', '9', '7', '3']
#forward:  9973
#backward:  9973
#original:  ['9', '9', '7', '3']
#forward:  973
#backward:  997
#original:  ['9', '9', '7', '3']
#forward:  73
#backward:  99
#original:  ['9', '9', '7', '3']
#forward:  3
#backward:  9

也许我错过了一些显而易见的小细节,或者我误解了问题的背景

1 个答案:

答案 0 :(得分:0)

主要问题是程序中的测试不正确,因为它接受显然不是素数的1和4:

all((i%d)!=0 for d in range(2, i//2))]

从我的角度来看,另一个问题是您在9999处停止。如果有5位数字的解决方案,此限制太低,或者如果较早找到所有11个解决方案,则此限制太高。 (后者碰巧是真的。)

测试素数时除法的上限为sqrt(N)。将N//2用作上限不是错误,但是对于较大的数字来说效率很低。

我对提高速度的主要建议是利用已经生成的一组较小质数的优势。例如,当测试3797时,您不必对派生的较小数字379、37和3进行测试。只需检查它们是否(或不)存在于已生成的素数集中到3797。