2010-06-30 74 views
2

我再次在Project Euler上工作,这次问题#4。这个脚本的要点是找到两个三位数字的最大回文产品。我认为解决这个问题相当简单,但我得到的答案太低。更具体地说,我得到580085,答案是906609.这个简单的Python脚本为什么会显示不正确的答案?

有人能告诉我这是什么不对?

#!/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() 
+1

项目欧拉的要点是不是要自己满意地找出答案? – wlashell 2010-06-30 01:30:04

+0

是的,但这不是解决问题的方法,因为我已经在Perl中完成了这个任务。这是关于如何在Python中做到这一点,与我当时的做法不同。 :) – Andy 2010-06-30 01:35:18

+2

顺便说一句:如果将第二个循环更改为'for范围(x,1000)'中的y,则可以完成一半的工作,并且没有理由导入sys和os。 – 2010-06-30 01:54:42

回答

6

您的代码不保证其打印最大的产品,因为有可能以后是一个较小的产品,替代它。为了解决这个问题,初始化t到零,并与

if z==s and int(z)>t: 
    t = int(z) 

或等价更换你的病情,

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

编辑:固定INT /串的问题上面。避免转换为字符串并返回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 
+0

这些编辑不太正确:z是一个字符串,不是int。 – 2010-06-30 01:38:19

+0

您需要将它们作为数字进行比较,而不是字符串。 – 2010-06-30 01:38:43

+0

我正在弄清楚为什么,但介绍您的修复产生输出'99999' – Andy 2010-06-30 01:40:14

3

问题是要找到最大的回文。你在这里没有什么可以找到最大的,只是最后一个。你认为最后一个会是最大的,但事实并非如此,因为你正在研究整个ZxZ广场的可能性。

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

1

如果您发现的大于您已有的大小,您需要添加一个检查。

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 
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条款,起着分配的角色(只停止重新计算该产品多次;-)。

注意,接受的答案是错误的(因为有几个人),因为它看起来对字符串“最大”,这是从INT最大不同 - 尝试运行它,你会看到! - )

+0

这非常整齐!虽然我更新编程,这将是一个obbu的地狱。 – Andy 2010-06-30 04:09:08

+1

@Andrew,也许 - 也许不是:我已经看到人们最近刚刚接受编程以列出理解(像上面那样的基因组并不是太不同,我从未教导过新手,因为基因组被引入,所以我有没有直接的经验)*比*更容易*,例如,真正的奥秘,如“x = x + 1”(“但是**怎么**可以'x'可能等于自己加上一个?!没有数字呢! )... ;-)。高级抽象编码需要努力从(比如说)C那里得到,但不一定比更低级别的东西,从“绝对零”到达那里。 – 2010-06-30 04:59:44

+0

我喜欢你如何在'for'中使用1元组来弥补没有'let'的Python! – Gabe 2012-02-26 06:02:49

0

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

相关问题