分析回文顺序时如何避免列表?

How to avoid lists when analyzing order for palindromes?

对于您在阅读本文时可能遇到的一般编码和逻辑问题,我只想提前道歉。我最近发现了 Project Euler 并认为它很有趣。我强调的是,不仅要找到答案,而且要创建一个通用函数,它可以在给定适当输入的情况下为任何类似案例找到答案。例如,第 4 题,涉及回文,可以在这里看到:https://projecteuler.net/problem=4

基本上我所做的是找到一种方法,将给定数字 n 的每个可能的数字组合相乘,然后找到回文乘积。但是,超过 3 位数的任何内容都需要很长时间才能处理。我相信这是因为我使用了 list() 函数来利用索引来确定产品是否是回文。还有另一种方法可以做这种性质的事情吗?我觉得这是把一个正方形从一个圆孔里塞进去。

这是有问题的函数。

def palindrome(n):
    number = 0
    for i in range(0,n):
        number = number + 9 * pow(10, i)
    a = pow(10, n - 1) - 1
    b = pow(10, n - 1)
    while a * b < number * number:
        a = a + 1
        b = a
        while b <= number:
            c = a * b
            b = b + 1
            digits = list(str(int(c)))
            lastdigits = digits[::-1]
            numdigits = len(digits)
            middle = int((numdigits - (numdigits % 2)) / 2) - 1
            if numdigits > 1 and digits[:middle + 1] == lastdigits[:middle + 1] and digits[0] == digits[-1] == '9' and numdigits == 2 * n:
                print(c)

"Find the largest palindrome made from the product of two 3-digit numbers."

3 位数可以是 100 - 999 之间的任何数字。关于最大乘积的一件事是有保证的:两个操作数必须尽可能大。

因此,从最大数 (999) 到最小数 (100) 逐步执行循环是有意义的。我们可以将回文添加到列表中,然后 return 最大的一个。

计算产品时,使用 str(...) 将其转换为字符串。现在,由于 python 的字符串拼接,检查回文很容易。如果 string == string[::-1],则字符串是回文,其中 string[::-1] 除了 return 原件的反转副本外什么都不做。

实施这些策略,我们有:

def getBiggestPalindrome():
    max_palindrome = -1
    for i in range(999, 99, -1):
        for j in range(999, i - 1, -1):
            prod = i * j
            str_prod = str(prod)
            if str_prod == str_prod[::-1] and prod > max_palindrome: 
                print(prod)
                max_palindrome = prod

    return max_palindrome

getBiggestPalindrome()

而且,这个 returns

>>> getBiggestPalindrome()
906609

请注意,您可以使用 range 函数生成从 startendstep 的值。迭代在 end 之前停止,这意味着最后一个值将是 100。