项目Euler 4与python:最大的Palindrome产品

时间:2016-12-29 20:52:52

标签: python numbers project palindrome digit

我是python(和编程)的新手而且我被困在项目Euler 4中。问题是:

“回文数字的读取方式相同。由两个2位数字的乘积组成的最大回文数为9009 = 91×99。

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

这是我到目前为止所得到的:

x

程序显示数字99999。在重新阅读程序之后,我发现len(d)== 5的if语句是无用的,因为我们想显示最大的数字,6位数字总是大于5位数字。删除这部分程序后,我得到了我应该拥有的结果(906609)。但我仍然想知道,即使我们试图找到5位数的回文数字,通常在我们显示最大数量的列表时应该忽略它们,那么为什么它给出了99999的结果呢?

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法是使用字符串创建回文列表,但使用整数获取最大值。这是我想出的:

x = 100

pal = []

而x <1000:

for i in range(100,1000):
    for j in range(100,1000):
        prod = str(i*j)
        if prod == prod[::-1]:
            pal.append(int(prod))
        x = x+1

print(max(pal))

答案 1 :(得分:0)

问题在于,在最后一个循环中,当您查找最大值时,您需要比较字符串而不是整数。这样做,它会给你你期望的结果:

Largest = int(PalindromicNumber[0])
for p in PalindromicNumber:
    if Largest <= int(p):
        Largest = int(p)   

根据python docs字符串比较使用词典排序:

  

比较使用词典排序:首先比较前两个项目,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两个项目,依此类推,直到任一序列用完为止。

答案 2 :(得分:0)

//This would be more precise 
def largestpalin(n):
    lowerbound=0
    upperbound=0
    for i in range(1,n+1):
       upperbound=upperbound*10
       upperbound=upperbound+9
    lowebound=int(1+lowerbound/10)
    maxproduct=0
    for i in range(upperbound,lowerbound-1,-1):
        for j in range(i,lowebound-1,-1):
            product=i*j
            if product<maxproduct:
                 break
            num=product
            reverse=0
            while(num!=0):
               rem=num%10
               reverse=reverse*10+rem
               num=num//10
          if product==reverse and product>maxproduct:
               maxproduct=reverse
   return maxproduct
n=3
res=largestpalin(n)
print(res)