Python 寻找两个三位数的最大回文乘积:逻辑上的错误是什么?

Python 寻找两个三位数的最大回文乘积:逻辑上的错误是什么?,python,algorithm,palindrome,Python,Algorithm,Palindrome,我想用以下方法解决这个问题:从两个值为999的变量开始,在一个循环中彼此相乘,然后递减一个变量,直到找到一个回文。代码如下: def is_palindrome(n): if str(n) == str(n)[::-1]: return True else: return False def largest_palindrome_product_of_3_digit(): x = 999 y = 999 for i in reversed(range(x +

我想用以下方法解决这个问题:从两个值为999的变量开始,在一个循环中彼此相乘,然后递减一个变量,直到找到一个回文。代码如下:

def is_palindrome(n):
  if str(n) == str(n)[::-1]:
    return True
  else:
    return False

def largest_palindrome_product_of_3_digit():
  x = 999
  y = 999
  for i in reversed(range(x + y + 1)):
    if is_palindrome(x * y):
      return x * y
    if i % 2 == 0:
      x -= 1
    else:
      y -= 1

我的方法的结果是698896,而正确的结果是906609。你能告诉我我的逻辑哪里不正确吗?

这里有几个提示:


  • 如果n=y*x是范围(600000,700000)(例如)内的任何数字,且y则可能缺少数字

    你考虑O(x+y)数,你需要考虑O(x*y)数。基本上,您的选择是,将其中一个从999循环到1,然后递减另一个,然后

    简单演示:

    >>> want = set()
    >>> for x in [1, 2, 3, 4, 5]:
    ...   for y in [1, 2, 3, 4, 5]:
    ...     want.add(x * y)
    ... 
    >>> got = set()
    >>> x = 5
    >>> y = 5
    >>> for i in reversed(range(x + y + 1)):
    ...   got.add(x * y)
    ...   if i % 2:
    ...     x -= 1
    ...   else:
    ...     y -= 1
    ... 
    >>> want == got
    False
    

    或者,您知道范围的顶部(999*999),您可以生成该范围内的所有回文数字,从最高到最低。从这里开始,做一个素因子分解,并检查在[100999]范围内是否有乘为两个数的因子的分裂是微不足道的。

    如果你总是交替递减x和y,x和y不是总是非常接近吗?如果您要查找的数字之间的间隔不止一个怎么办?您必须扫描所有可能的3位数组合,因此您应该使用两个嵌套循环,一个递增x,一个递增y,从100到999。我的想法是,在这个范围的高端,两个数字的第一个回文乘积会比以前发现的回文乘积高。我错了,但我不知道为什么。698896,我的方法的错误结果,是836*836的结果。当我从范围的高端一个接一个地递减时,怎么会有更高的回文乘积呢?x和y之间的距离永远不会超过1。你不包括999*997这样的案子,显然比836*836大很多。哦,我想我现在知道了。谢谢@Rawing.x的最小可能值是范围开始的平方根吗?并且不需要测试y<(范围结束)/999?我不知道x和y的最后一位意味着什么,它们的乘积的第一位和最后一位是相同的。我很想看看你的算法。谢谢你的时间!(顺便说一句,我不是那个否决你的人。)很好!谢谢你,先生,我现在应该可以编码了。
    >>> want = set()
    >>> for x in [1, 2, 3, 4, 5]:
    ...   for y in [1, 2, 3, 4, 5]:
    ...     want.add(x * y)
    ... 
    >>> got = set()
    >>> x = 5
    >>> y = 5
    >>> for i in reversed(range(x + y + 1)):
    ...   got.add(x * y)
    ...   if i % 2:
    ...     x -= 1
    ...   else:
    ...     y -= 1
    ... 
    >>> want == got
    False