我正在尝试解决项目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
答案 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