Python 寻找两个三位数的最大回文乘积:逻辑上的错误是什么?
我想用以下方法解决这个问题:从两个值为999的变量开始,在一个循环中彼此相乘,然后递减一个变量,直到找到一个回文。代码如下: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 +
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。你能告诉我我的逻辑哪里不正确吗?这里有几个提示:
你考虑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