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

2024-04-27 02:56:40 发布

您现在位置:Python中文网/ 问答频道 /正文

只是想为阅读本文时可能遇到的一般编码和逻辑提前道歉。我最近发现了欧拉计划,觉得很有趣。我不仅要找到答案,而且要做一个泛型函数,在给定适当输入的情况下,可以找到任何类似情况的答案。例如,问题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)

Tags: and函数答案numbermiddle编码情况数字
1条回答
网友
1楼 · 发布于 2024-04-27 02:56:40

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

三位数可以是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。你知道吗

相关问题 更多 >