找到最大的回文,它是两个5位素数的乘积,哪里是错误的

时间:2018-03-02 13:54:05

标签: python-2.7 numpy sympy

我试图找到最大的回文,它是两个5位素数的乘积。该程序还必须返回乘数。问题是该程序工作很长时间并给出错误的结果。错误在哪里以及如何纠正错误?

 transform(functionName)

1 个答案:

答案 0 :(得分:0)

您需要使用generators来懒散地链接您的操作,否则您将存储大量列表。

首先我们需要恢复素数。

import math

def find_primes(n):
    # Prepare our Sieve, for readability we make index match the number by adding 0 and 1
    primes = [False] * 2 + [True] * (n - 1)

    # Remove non-primes
    for x in range(2, int(math.sqrt(n) + 1)):
        if primes[x]:
            primes[2*x::x] = [False] * (n // x - 1)

    return [x for x, is_prime in enumerate(primes) if is_prime]

然后,为了避免记忆错误,我们确保将所有内容都保留为生成器。

import itertools

def find_palindrome(n):
    # Those all output generators instead of lists
    primes = find_primes(n)
    factors = itertools.combinations_with_replacement(primes, 2)
    products = ((p * q, p, q) for p, q in factors)
    palindromes = ((pal, p, q) for pal, p, q in products if is_palindrome(pal))

    try:
        return max(palindromes)
    except ValueError:
        # No palindrome exists
        return None

利润。

find_palindrome(99999) # (999949999, 30109, 33211)

Intel i5-2500K 的运行时间约为25秒。