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

And*_*ndy 2 python palindrome

我正在研究Project Euler,这次问题#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()
Run Code Online (Sandbox Code Playgroud)

int*_*jay 6

您的代码无法确保打印出最大的产品,因为以后可能会有更小的产品替换它.要修复它,初始化t为零,并用.替换你的条件

if z==s and int(z)>t:
    t = int(z)
Run Code Online (Sandbox Code Playgroud)

或等效地,

if z==s:
    t = max(t,int(z))
Run Code Online (Sandbox Code Playgroud)

编辑:修复上面的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
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 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])
Run Code Online (Sandbox Code Playgroud)

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

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