这个简单的Python脚本为什么会显示不正确的答案?
我再次在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()
您的代码不保证其打印最大的产品,因为有可能以后是一个较小的产品,替代它。为了解决这个问题,初始化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
这些编辑不太正确:z是一个字符串,不是int。 – 2010-06-30 01:38:19
您需要将它们作为数字进行比较,而不是字符串。 – 2010-06-30 01:38:43
我正在弄清楚为什么,但介绍您的修复产生输出'99999' – Andy 2010-06-30 01:40:14
问题是要找到最大的回文。你在这里没有什么可以找到最大的,只是最后一个。你认为最后一个会是最大的,但事实并非如此,因为你正在研究整个ZxZ广场的可能性。
例如,在考虑101 * 999后,您正在考虑200 * 101。
如果您发现的大于您已有的大小,您需要添加一个检查。
由于您使用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
这里是做在一个单一的表达棘手,但正确的方法...:
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最大不同 - 尝试运行它,你会看到! - )
这非常整齐!虽然我更新编程,这将是一个obbu的地狱。 – Andy 2010-06-30 04:09:08
@Andrew,也许 - 也许不是:我已经看到人们最近刚刚接受编程以列出理解(像上面那样的基因组并不是太不同,我从未教导过新手,因为基因组被引入,所以我有没有直接的经验)*比*更容易*,例如,真正的奥秘,如“x = x + 1”(“但是**怎么**可以'x'可能等于自己加上一个?!没有数字呢! )... ;-)。高级抽象编码需要努力从(比如说)C那里得到,但不一定比更低级别的东西,从“绝对零”到达那里。 – 2010-06-30 04:59:44
我喜欢你如何在'for'中使用1元组来弥补没有'let'的Python! – Gabe 2012-02-26 06:02:49
我会补充说你可以节省一些时间在这个测试中。所有6位数的回文数必须可以被11整除。因此,至少有一个因子必须可以被11整除。
项目欧拉的要点是不是要自己满意地找出答案? – wlashell 2010-06-30 01:30:04
是的,但这不是解决问题的方法,因为我已经在Perl中完成了这个任务。这是关于如何在Python中做到这一点,与我当时的做法不同。 :) – Andy 2010-06-30 01:35:18
顺便说一句:如果将第二个循环更改为'for范围(x,1000)'中的y,则可以完成一半的工作,并且没有理由导入sys和os。 – 2010-06-30 01:54:42