我试图找到最大的回文,它是两个5位素数的乘积。该程序还必须返回乘数。问题是该程序工作很长时间并给出错误的结果。错误在哪里以及如何纠正错误?
transform(functionName)
答案 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秒。