用python投影Euler#4。什么;我的代码怎么了?
我正在尝试使用python来处理ProjectEulerProblem 4。问题陈述如下: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99 查找由两个3位数字的乘积构成的最大回文 我写下了一个解决方案:用python投影Euler#4。什么;我的代码怎么了?,python,python-2.7,Python,Python 2.7,我正在尝试使用python来处理ProjectEulerProblem 4。问题陈述如下: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=91×99 查找由两个3位数字的乘积构成的最大回文 我写下了一个解决方案: s=0 x=100 y=100 list=[] z=x*y def palindrome(): while z>=1: s=s*10+z%10 z=z/10 if z==s:
s=0
x=100
y=100
list=[]
z=x*y
def palindrome():
while z>=1:
s=s*10+z%10
z=z/10
if z==s:
list.append(z)
while x<=999:
while y<=999:
palindrome()
y=y+1
x=x+1
y=100
print list
s=0
x=100
y=100
列表=[]
z=x*y
def palindrome():
当z>=1时:
s=s*10+z%10
z=z/10
如果z==s:
list.append(z)
当x时,您得到的错误可能是:
UnboundLocalError: local variable 'z' referenced before assignment
这意味着没有定义z
,至少在palindrome()函数中没有定义。您添加global
关键字的解决方案在技术上是正确的。然而,正如其他人已经指出的,globals的使用使得代码很难理解
我不清楚回文()
应该做什么。它应该检查一个数字是否是回文吗?生成回文数?要解决这个问题,您应该考虑结构化代码。当然,有很多方法可以做到这一点,随着时间的推移,你会找到自己的风格
那么,我的建议是,考虑一下你通常会如何解决这个问题。如果您不知道解决方案,编码对您没有帮助。有时候,在解决像这样的问题时,我编写函数时没有声明它们的主体。你可以自上而下或者自下而上,两者都可以。例如:
def is_palindrome(n):
""" Check if n is a palindrome number. """
pass
def multiples_of_3_digits():
""" Return all numbers that are the product of two 3-digit numbers ."""
pass
def main():
print max(n for n in multiples_of_3_digits() if is_palindrome(n))
这样,您可以专注于解决问题,然后专注于实际编码。也许您会添加帮助函数,或者意识到您可以以更有效的方式解决问题,但这只是一个开始。祝你好运
min=100
max=999
max_palindrome = 0
for a in range(min,max + 1):
for b in range(a + 1, max + 1):
prod = a*b
if prod > max_palindrome and str(prod)==(str(prod)[::-1]):
max_palindrome = prod
print max_palindrome
这里我们只关心最大回文数,所以一旦知道其他回文数不是最大回文数,我们就不会花时间存储它们。此外,if语句首先检查给定的乘积是否大于已知的最大回文数,然后使用字符串转换和列表切片检查该数字是否为回文数。这将使我们的代码速度加快一点,因为无论所讨论的产品是否是回文,大于比较通常都会失败。当我们运行这个程序时,我们得到以下结果
906609
另一种方式:
由于其他人指出的原因,我不鼓励您使用全局变量。我还想让你参考安德烈的方法,因为它将教会你如何组织自己。在这种方法中,我也将使用2个函数is_palindrome(num)[检查数字是否为回文]和find_max_palindrome[查找最大回文]
def is_palindrome(num):
reversed = 0
original = num
if num < 10:
return True
if num % 10 == 0:
return False
while num >= 1:
reversed = (reversed * 10) + (num % 10)
num = num/10
if original == reversed:
return True
else:
return False
def find_max_palindrome():
max_palindrome = 0
a = 999
b = 999
prod = 0
while a > 99:
b = 999
while b >= a:
prod = a*b
if prod > max_palindrome and is_palindrome(prod):
max_palindrome = prod
b = b -1
a = a - 1
return max_palindrome
print find_max_palindrome()
def是_回文(num):
反向=0
原始=数量
如果num<10:
返回真值
如果num%10==0:
返回错误
当num>=1时:
反向=(反向*10)+(数值%10)
num=num/10
如果原始==反向:
返回真值
其他:
返回错误
def find_max_palindrome():
最大回文数=0
a=999
b=999
prod=0
当a>99时:
b=999
当b>=a时:
产品=a*b
如果prod>max_回文且为_回文(prod):
最大回文数=prod
b=b-1
a=a-1
返回最大回文数
打印查找最大回文()
停止使用这么多全局变量!使用函数参数获取输入,并使用return
传回输出您每次都将z除以10来减少z。我认为您对回文的思考过度了。我的“is_palidrome”是def isPalidrome(x):return x==int(str(x)[::-1])
或者,当我将其转换为字符串,并将其转换回int时,数字是否相同?@NightShadeQueen确切地说:DIt很容易生成两个正整数的所有乘积,三位数递减(从999到100),那么第一个回文是最大的。测试一个整数的回文性可以通过将其字符串化,使其成为一个可以用[:-1]反转的字符数组,并与原始数组进行比较来完成。我不知道为什么有人在没有评论的情况下否决了你的答案。你写了一个很好的解释。我希望这不会阻止您进一步参与StackOverflow,不是这里的每个人都是这样@安德烈·拉兹洛有两件事。1) 该解释后来被编辑。2) 这根本不能回答领主的问题。霸王是在寻求代码方面的帮助,而不是寻求完全独立的解决方案。得到完全独立的代码来解决Euler问题,就好比请求帮助修理你的汽车,让别人给你一辆新车;它可能会帮助你开车去上班,但你什么也没学到。@Alex你指出我的解决方案与他试图做的完全不同是对的。他通过算术反转数字来检查数字是否是回文,而我通过将整数转换为字符串并使用列表片段反转字符来测试同样的事情。后一种方法比前一种方法快得多,这就是我使用它的原因。不过,我很快会用另一种方式重新编辑我的答案。@Andre我上个月开始学习使用python编程。多亏了mitx 6.00.1x和stackoverflow,我学到了很多。所以没有什么能阻止我对StackOverflow的贡献:)@Alex,我同意这两点。我个人保留对错误或误导性答案的否决票。巨魔或垃圾邮件当然会被标记。如果有人提供了一个解决方案,而不是将你引向正确的方向,至少他们做出了诚实的努力。我还认为给予反馈,特别是给新用户,而不是(或作为补充)否决票是很好的。
def is_palindrome(num):
reversed = 0
original = num
if num < 10:
return True
if num % 10 == 0:
return False
while num >= 1:
reversed = (reversed * 10) + (num % 10)
num = num/10
if original == reversed:
return True
else:
return False
def find_max_palindrome():
max_palindrome = 0
a = 999
b = 999
prod = 0
while a > 99:
b = 999
while b >= a:
prod = a*b
if prod > max_palindrome and is_palindrome(prod):
max_palindrome = prod
b = b -1
a = a - 1
return max_palindrome
print find_max_palindrome()