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

时间:2017-07-04 00:38:57

标签: python palindrome

只是想提前为您在阅读时遇到的一般编码和逻辑血腥道歉。我最近发现了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)

1 个答案:

答案 0 :(得分:3)

  

查找由两个3位数字的乘积制成的最大回文。

3位数字将是100 - 999之间的任何数字。保证最大产品的一件事:两个操作数必须尽可能大。

因此,从最大数字(999)开始到最小数字(100)循环是有意义的。我们可以将回文附加到列表中,然后返回最大的回文。

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

实施这些策略,我们有:

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()

然后,返回

>>> getBiggestPalindrome()
906609

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