2

我再次在 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()
4

6 回答 6

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
于 2010-06-30T01:30:04.040 回答
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 不同——尝试运行它,你会看到!-)

于 2010-06-30T02:13:17.140 回答
3

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

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

于 2010-06-30T01:30:39.243 回答
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
于 2010-06-30T01:44:29.757 回答
1

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

于 2010-06-30T01:34:56.380 回答
0

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

于 2010-07-02T14:56:15.993 回答