项目Euler 4未按预期工作

时间:2015-07-05 11:28:03

标签: python python-2.7

此代码符合project euler problem no.4

  

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。

     

找出由两个3位数字的乘积制成的最大回文。

预期输出为906609,但此代码的输出为994009

from array import *

def is_palindrome(num):

    a = array('i',[])
    j=0
    while(num>0):
        a.insert(j,num%10)
        num=num/10
        j+=1
    if(a[0]==a[j-1]):
        return True
    else:
        return False

a=100
b=100
max=0
c=False
while(a<=999):

    while(b<=999):
        n=a*b
        c=is_palindrome(n)
        if(c and n>max):
            max = n
        b+=1
   b=100    
   a+=1    
print(max)    

2 个答案:

答案 0 :(得分:0)

您的is_palindrome()函数错误,您只检查第一个元素是否等于最后一个元素,如果它们相等则返回True,如果不相等则返回False

if(a[0]==a[j-1]):
    return True
else:
    return False

显然,这是错误的 -

  

回文是一个单词,短语,数字或其他字符序列,它们向后或向前读取相同的字符。

is_palindrome()函数的简单解决方案是 -

def is_palindrome(num):
    s = str(num)
    n = len(s)
    return all(s[i] == s[n-i-1] for i in range(0,int(n/2)))

答案 1 :(得分:0)

你正在过度思考你的回文:P如果一个回文在前进和后退中读取相同的结果,那么......反转你的数字。

def is_Palindrome(num):
    return str(num) == str(num)[::-1]

步长为-1的切片与反转相同。

(另外,作为项目euler的一般化的东西,但是对于这个问题可能没有必要...当你想要最大的数字时,不要从底部开始迭代,从顶部开始迭代,并在你再也无法击败目前最好的答案了。)