Python 循环无缘无故地结束

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,

我试图解决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,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