Python 循环无缘无故地结束
我试图解决Euler项目中的问题4,即: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。 查找由两个3位数字的乘积构成的最大回文。 我编写的初始代码是:Python 循环无缘无故地结束,python,Python,我试图解决Euler项目中的问题4,即: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99。 查找由两个3位数字的乘积构成的最大回文。 我编写的初始代码是: def check_reversed(number): number = str(number) if number == number[::-1]: return True for x in range(100,1000): for y in range(100,
def check_reversed(number):
number = str(number)
if number == number[::-1]:
return True
for x in range(100,1000):
for y in range(100,1000):
if check_reversed(x*y) == True:
print x,y,x*y
出于某种原因,第二个循环在583号停止,并输出错误的答案。当我将第二个“for”循环的范围改为(5841000)时,它会输出正确的答案。
我的问题是为什么第二个循环结束于583号
编辑:已解决:(感谢您的帮助!)
您的第二个循环根本不以
583
结束583恰好是回文的y
中最高的x=995
前面两行代码将打印:
993 913 906609
这显然与你的分析相矛盾
您需要跟踪最大结果,而不是假设最大值x
会给出答案
请注意,对于y
每个循环测试相同的数字几乎没有意义;当组合可以执行以下操作时,无需测试范围(1001000)
的产品:
from itertools import combinations
def check_reversed(x, y):
number = str(x * y)
return number == number[::-1]
x, y = max((c for c in combinations(range(100, 1000), r=2) if check_reversed(*c)),
key=lambda c: c[0] * c[1])
print x, y, x * y
循环工作正常,因为条件中的最后两个数字是995583
但是,这个脚本解决了您的问题
def check_reversed(number):
number = str(number)
if number == number[::-1]:
return True
temp = 0
for x in range(100,1000):
for y in range(100,1000):
if check_reversed(x*y) and temp <= x*y:
temp = x * y
print x,y,x*y
def check_反转(编号):
编号=str(编号)
如果数字==数字[:-1]:
返回真值
温度=0
对于范围内的x(1001000):
对于范围(1001000)内的y:
如果check_reversed(x*y)和temp,您可以将check_reversed
减少为返回编号==number[:-1]
,而不是使用if
。这可能是您得到了一个回文答案,但不是最大的答案。但奇怪的是它停止了…不要在if
测试中使用==True
;这就是的目的。你似乎得到了所有的回文,而不仅仅是最大的回文。另外,583恰好是Y的最大值,X的最大值产生回文。你说它停止是什么意思?它不会停止。(995583)确实是您打印顺序中的最后一个。更改y循环范围时得到的最后一个循环确实出现在未修改版本的输出中,就在前面。其中一个周末,我需要花一段时间学习itertools
。我在上面贴了一行代码,但速度很慢,因为它运行808201次乘法和1616402次字符串转换,并构建了一个包含800000个元组的列表。Itertools会快得多。@adsmith:你也掉进了产品陷阱;您只需要在这里测试独特的组合;e、 不到一半,没错!公平地说,如果3位数字的最大回文是一个完美的正方形,itertools.compositions
不会找到它<代码>打印(“{product[1]}*{product[2]}=={product[0]}”。格式(product=max([(x*y,x,y)表示范围内的x(1001000)表示范围内的y(x,1000),如果str(x*y)==str str(x*y)[::-1]])
速度快得令人难以置信。@adsmith但对于范围内的x(100,1000)表示范围内的x,很容易链接(x,x)
如果是这样的话。@adsmith:所有的8个回文方块(对于[101、111、121、202、212、264、307、836]
),所以很容易就可以弥补差异。
def check_reversed(number):
number = str(number)
if number == number[::-1]:
return True
temp = 0
for x in range(100,1000):
for y in range(100,1000):
if check_reversed(x*y) and temp <= x*y:
temp = x * y
print x,y,x*y