为什么这个简单的Python脚本会显示错误的答案?

时间:2010-06-30 01:26:28

标签: python palindrome

我再次致力于项目欧拉,这次问题#4。这个脚本的要点是找到两个三位数字的最大回文产品。我认为解决起来相当简单,但我得到的答案太低了。更具体地说,我得到580085,答案是906609.

有人可以告诉我这是不正确的吗?

#!/usr/bin/env python
# encoding: utf-8
"""
P4.py

Created by Andrew Levenson on 2010-06-29.
Copyright (c) 2010 __MyCompanyName__. All rights reserved.
"""

import sys
import os


def main():
    for x in range(100, 1000):
        for y in range(100, 1000):
            z = str( x * y )
            s = str( z[::-1] ) # Reverse z
            if z == s:
                t = z
    print t


if __name__ == '__main__':
    main()

6 个答案:

答案 0 :(得分:6)

您的代码无法确保打印出最大的产品,因为以后可能会有更小的产品替代它。要解决此问题,请将t初始化为零,然后用

替换您的条件
if z==s and int(z)>t:
    t = int(z)

或等效地,

if z==s:
    t = max(t,int(z))

编辑:修复了上面的int / string问题。尽管如此,避免转换为字符串并返回到int更加清晰:

def isPalindrome(x):
    s = str(x)
    return s == s[::-1]

t = 0
for x in range(100, 1000):
    for y in range(100, 1000):
        z = x * y
        if isPalindrome(z) and z > t:
            t = z
print t

答案 1 :(得分:6)

这是在单个表达式中执行此操作的一种棘手但正确的方法......:

def main():
  print max(p for x in range(100, 1000) for y in range(x, 1000)
              for p in (x * y,) if str(p) == str(p)[::-1])

棘手的部分是单项for p子句,它起着作业的作用(只是为了停止多次重新计算该产品; - )。

请注意,接受的答案是错误的(和其他几个一样),因为它会查找字符串“max”,这与 int max不同 - 尝试运行它,你会看到! - )

答案 2 :(得分:3)

问题是找到最大的回文。你在这里找不到最大的东西,只是最后一个。你假设最后一个是最大的,但事实并非如此,因为你正在检查整个ZxZ方块的可能性。

例如,在考虑101 * 999后,您正在考虑200 * 101。

答案 3 :(得分:2)

由于您使用2 for循环的方式,您将获得具有最大x值的数字,而不是最大的产品。

906609 = 993 * 913

然后x继续递增,下一个回文是:

580085 = 995 * 583

你需要一个变量来跟踪你找到的最大的回文。

def main():
    largest = 0
    for x in range(100, 1000):
        for y in range(100, 1000):
            z = str( x * y )
            s = str( z[::-1] ) # Reverse z
            if z == s:
                t = int(z)
                if t > largest:
                    largest = t
    print largest

答案 4 :(得分:1)

如果您找到的那个大于您已经拥有的那个,您需要添加一个检查。

答案 5 :(得分:0)

我要补充一点,你可以节省一些时间在这个测试中。所有6位数的回文必须可以被11整除。因此,至少有一个因素必须能被11整除。