程序生成回文数

时间:2014-01-23 20:46:39

标签: python

import math

thevalue = 0

for x in range (100,999):
    for y in range (100,999):
        mynum=x*y
        mynum_str=str(mynum)

        for z in range(0,math.floor(len(mynum_str)/2)):
            if mynum_str[0+z] != mynum_str[len(mynum_str)-1-z]:
                break
            else:
                if (len(mynum_str)-1-z) -1 == z:              
                    thevalue = mynum

print(thevalue)

给了我580085,这不是正确答案(假设超过900000)...... 正在处理http://projecteuler.net/problem=4 ...关于我哪里出错的提示?

2 个答案:

答案 0 :(得分:7)

您不需要过于复杂的循环来检查数字的回文性质:

# Using extended slice notation to reverse the string
if str(n) == str(n)[::-1]:
    print "Palindrome!"

至于完整的解决方案,您的程序只是在寻找 a 回文编号。有多个回文数字是3位数的乘积。你想要最大的那些。

(当然,这不是完整的解决方案 - 但如果我们只是给你一个项目欧拉挑战的解决方案就没有乐趣了;)

答案 1 :(得分:0)

有一种更简单的检查回文的方法。只需反转字符串并将其与原始字符串进行比较:if(mynum_str == mynum_str[::-1])

你得到580085的原因是你的程序只打印出它找到的最后一个值。 (有2470种可能的回文。)尝试将它们存储在列表中并对其进行排序,或者只保留最大版本:

import math
import string

maxpalindrome = 0
for x in range (100,999):
    for y in range (100,999):
        mynum=x*y
        mynum_str=str(mynum)

        if(mynum_str == mynum_str[::-1]):
            maxpalindrome = max(string.atoi(mynum_str), maxpalindrome)

print(maxpalindrome)