循环无缘无故结束

时间:2013-12-20 17:52:53

标签: python

我正在尝试解决项目Euler中的问题4:

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是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”循环的范围更改为(584,1000)时,它会输出正确的答案。 我的问题是为什么第二个循环在数字583处结束?

编辑:已解决:(感谢您的帮助!)

def check_reversed(number):
    number = str(number)
    return number == number[::-1]

max_pal = 0
for x in range(100,1000):
    for y in range(100,1000):
        if check_reversed(x*y) == True:
            if x*y > max_pal:
                max_pal = x*y

print max_pal

2 个答案:

答案 0 :(得分:10)

你的第二个循环根本不会在583结束; 583恰好是y 的最高x = 995 ,这是一个回文。

前面两行,代码打印出来:

993 913 906609

这显然与你的分析相矛盾。

您需要跟踪最大结果,而不是假设最大 x 为您提供答案。

请注意,测试每个循环y的相同数字几乎没有意义;当组合完成时,无需测试range(100, 1000)的产品:

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

答案 1 :(得分:0)

你的循环工作正常,因为你条件中的最后两个数字是995 583 但是这个脚本解决了你的问题

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