Euler项目-最大回文4 Python

Euler项目-最大回文4 Python,python,Python,我是python新手,并决定通过对project Euler进行一些挑战来改进我的编码(一般来说)是一个好主意。我目前被困在问题4上,我不确定出了什么问题(对于那些不知道的人,问题4如下所示): 回文数字的两种读取方式相同 由两个两位数的乘积构成的最大回文是9009=91 x 99 查找由两个3位数字的乘积构成的最大回文 x, y = 999, 999 palindrome = [] while True: palindrome = [i for i in str(x * y)]

我是python新手,并决定通过对project Euler进行一些挑战来改进我的编码(一般来说)是一个好主意。我目前被困在问题4上,我不确定出了什么问题(对于那些不知道的人,问题4如下所示):

回文数字的两种读取方式相同

由两个两位数的乘积构成的最大回文是9009=91 x 99

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

x, y = 999, 999
palindrome = []
while True:
    palindrome = [i for i in str(x * y)]
    r_palindrome = palindrome[::-1]
    if palindrome == r_palindrome:
        break
    else:
        y -= 1
        if y < 100: 
            y = x
            x -= 1
print x, y, palindrome
x,y=999,999
回文=[]
尽管如此:
回文=[i代表str中的i(x*y)]
r_palindrome=回文[:-1]
如果回文==r_回文:
打破
其他:
y-=1
如果y<100:
y=x
x-=1
打印x,y,回文
我似乎得到了答案,感觉太低了。
有人能解释一下做这件事的最佳方法吗?我目前的代码哪里做错了,而不是简单的“这是代码”回答

x=999
y=999
开始,然后仅递减
y
,直到用递减的
x
和重置
y
重新启动,并不能保证您将首先命中最大回文

想想下面的例子:让我们想象一下对产品的不同需求(为了不破坏这里的回文结果)。假设您从
x=999
开始,然后到达
y=101
,直到找到第一个“有效”结果

在您的情况下,您将接受
999*101=100899
作为最大结果。但实际上可能有一种不同的解决方案,您从未看过,但显然要大得多

所以你需要改变你决定何时停止寻找的方式,并且知道你达到了最大的数量


顺便说一句,作为欧拉项目的一般提示:特别是第一个问题可以用蛮力轻松解决(即尝试所有可能的解决方案)。虽然这可能不会给你一种满意的感觉,即你以一种聪明的方式解决了问题,但它确实给了你一个如何达到目的的想法。您随时可以找到更好的解决方案,但请记住,Project Euler实际上有很多问题,无论如何使用蛮力都是完全不可能的,因此您以后有足够的时间来担心;)

对于这个特殊的问题,你可以写一个列表,给出所有回文,然后得到最大值。那是一条单行线;它的效率非常低,但对于这个特别小的输入域,它的速度足够快,仍然可以立即为您提供答案:

max([(x * y, x, y) for x in range(100, 1000) for y in range(100, 1000) if str(x * y) == str(x * y)[::-1]])

x=999
y=999
开始,然后仅递减
y
,直到以递减的
x
和重置
y
重新启动,并不能保证您将首先命中最大回文

想想下面的例子:让我们想象一下对产品的不同需求(为了不破坏这里的回文结果)。假设您从
x=999
开始,然后到达
y=101
,直到找到第一个“有效”结果

在您的情况下,您将接受
999*101=100899
作为最大结果。但实际上可能有一种不同的解决方案,您从未看过,但显然要大得多

所以你需要改变你决定何时停止寻找的方式,并且知道你达到了最大的数量


顺便说一句,作为欧拉项目的一般提示:特别是第一个问题可以用蛮力轻松解决(即尝试所有可能的解决方案)。虽然这可能不会给你一种满意的感觉,即你以一种聪明的方式解决了问题,但它确实给了你一个如何达到目的的想法。您随时可以找到更好的解决方案,但请记住,Project Euler实际上有很多问题,无论如何使用蛮力都是完全不可能的,因此您以后有足够的时间来担心;)

对于这个特殊的问题,你可以写一个列表,给出所有回文,然后得到最大值。那是一条单行线;它的效率非常低,但对于这个特别小的输入域,它的速度足够快,仍然可以立即为您提供答案:

max([(x * y, x, y) for x in range(100, 1000) for y in range(100, 1000) if str(x * y) == str(x * y)[::-1]])

好的,为了找到解决方案,让我们使用暴力:

>>> prod = itertools.product(range(999,99,-1),range(999,99,-1))
>>> palindromes = [(x*y,x,y) for x,y in prod  if str(x*y) == str(x*y)[::-1]]
>>> max(palindromes, key=lambda t: t[0])
(906609, 993, 913)
花了一点时间,但至少我们有答案。我已经制定了一个非常快速有效的解决方案,我认为这需要你努力实现的本质:

>>> x = 999
>>> palindromes = []
>>> floor = 99
>>> while x > floor:
...     for i in range(x,floor,-1):
...         product = x*i
...         candidate = str(product)
...         if candidate == candidate[::-1]:
...             palindromes.append((product,x,i))
...             floor = i
...             break
...     x -= 1
... 
>>> palindromes
[(580085, 995, 583), (906609, 993, 913), (886688, 968, 916), (888888, 962, 924)]
>>> 

从本质上讲,这会用最后一次给我们回文的最低数字来更新地板。我们知道我们不必每次都看起来比这个低

好的,为了找到解决方案,让我们使用暴力:

>>> prod = itertools.product(range(999,99,-1),range(999,99,-1))
>>> palindromes = [(x*y,x,y) for x,y in prod  if str(x*y) == str(x*y)[::-1]]
>>> max(palindromes, key=lambda t: t[0])
(906609, 993, 913)
花了一点时间,但至少我们有答案。我已经制定了一个非常快速有效的解决方案,我认为这需要你努力实现的本质:

>>> x = 999
>>> palindromes = []
>>> floor = 99
>>> while x > floor:
...     for i in range(x,floor,-1):
...         product = x*i
...         candidate = str(product)
...         if candidate == candidate[::-1]:
...             palindromes.append((product,x,i))
...             floor = i
...             break
...     x -= 1
... 
>>> palindromes
[(580085, 995, 583), (906609, 993, 913), (886688, 968, 916), (888888, 962, 924)]
>>> 

从本质上讲,这会用最后一次给我们回文的最低数字来更新地板。我们知道我们不必每次都看起来比这个低

你为什么要检查产品是否均匀?我遗漏了什么吗?当我运行此程序时,我得到了“982869['8','5','3','3','5','8']”。很抱歉,在编辑它时遗漏了一个相等值。嗯,我不是很确定,也许我的逻辑在做了一些更改后变得非常混乱。我现在用995*583得到580085。您的代码并没有达到您认为的效果,但您的第一步应该是调试。将x和y设置为15,
print“x={},y={}”。在每次迭代中格式化(x,y)
,您将看到为什么要检查产品是否为偶数?我遗漏了什么吗?当我运行此程序时,我得到了“982869['8','5','3','3','5','8']”。很抱歉,在编辑它时遗漏了一个相等值。嗯,我不是很确定,也许我的逻辑是可怕的关闭后,一些变化,我现在得到580085与995*583你的代码