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