самый высокий палиндром с 3-значными числами в python

в задаче 4 из http://projecteuler.net/ он говорит:

палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, изготовленный из произведения двух 2-значных чисел, составляет 9009 = 91 * 99.

найдите самый большой палиндром, изготовленные из произведения двух 3-значных чисел.

у меня есть этот код здесь

def isPalindrome(num):
    return str(num) == str(num)[::-1]
def largest(bot, top):
    for x in range(top, bot, -1):
        for y in range(top,bot, -1):
            if isPalindrome(x*y):
                return x*y
print largest(100,999)

Он должен найти самый большой палиндром, он выплевывает 580085 которое я считаю правильно, но проект Эйлер так не думает, У меня что-то не так?


когда я почитал цикл for, я не думал об этом, я удалил вещь, которая проверяет на самый большой, глупый меня. Вот рабочий код

def isPalindrome(num):
    return str(num) == str(num)[::-1]
def largest(bot, top):
    z = 0
    for x in range(top, bot, -1):
        for y in range(top,bot, -1):
            if isPalindrome(x*y):
                if x*y > z:
                    z = x*y
    return z
print largest(100,999)

он выплевывает 906609

11 ответов


итерация в обратном направлении не находит наибольшего x*y, Он находит палиндром с самым большим x. Существует больший ответ, чем 580085; он имеет меньший x но больше y.


это было бы более эффективно написано как:

from itertools import product

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

multiples = ( (a, b) for a, b in product(xrange(100,999), repeat=2) if is_palindrome(a*b) )
print max(multiples, key=lambda (a,b): a*b)
# (913, 993)

Вы можете найти itertools и генераторы очень полезны, если вы делаете Эйлер в Python.


Не самый эффективный ответ, но мне нравится, что он достаточно компактен, чтобы поместиться в одной строке.

print max(i*j for i in xrange(1,1000) for j in xrange(1,1000) if str(i*j) == str(i*j)[::-1])

попытался сделать его более эффективным, сохраняя при этом разборчивость:

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

def fn(n):
    max_palindrome = 1
    for x in range(n,1,-1):
        for y in range(n,x-1,-1):
            if is_palindrome(x*y) and x*y > max_palindrome:
                max_palindrome = x*y
            elif x * y < max_palindrome:
                break
    return max_palindrome

print fn(999)

здесь я добавил два "перерыва", чтобы улучшить скорость этой программы.

def is_palindrome(num):
    return str(num) == str(num)[::-1]
def max_palindrome(n):
    max_palindrome = 1
    for i in range(10**n-1,10**(n-1)-1,-1):
        for j in range(10**n-1,i-1,-1):
            if is_palindrome(i*j) and i*j > max_palindrome:
                max_palindrome = i * j
                break
            elif i*j < max_palindrome:
                break
    return max_palindrome
n=int(raw_input())
print max_palindrome(n)

просто:

def is_pallindrome(n):
    s = str(n)
    for n in xrange(1, len(s)/2 + 1):
        if s[n-1] != s[-n]:
            return False    
    return True

largest = 0
for j in xrange(100, 1000):
    for k in xrange(j, 1000):
        if is_pallindrome(j*k):
            if (j*k) > largest: largest = j*k
print largest

каждый раз он не должен начинаться с 999, как это уже было найдено ранее.Ниже приведен простой метод с помощью Строковой функции, чтобы найти самый большой палиндром, используя трехзначное число

def palindrome(y):
    z=str(y)
    w=z[::-1]
    if (w==z):
        return 0
    elif (w!=z):
        return 1        
h=[]
a=999
for i in range (999,0,-1):
    for j in range (a,0,-1):
    l=palindrome(i*j)
    if (l==0):
        h=h+[i*j]               
    a-=1
print h
max=h[0]

for i in range(0,len(h)):
    if (h[i] > max):
    max= h[i]
print "largest palindrome using multiple of three digit number=%d"%max  

вот мой код для решения этой проблемы.

lst = []
for i in range(100,1000): 
    for n in range(2,i) : 
        lst.append (i* n) 
        lst.append(i*i)

lst2=[]
for i in lst: 
    if str(i) == str(i)[::-1]:
        lst2.append(i)
print max(lst2) 

580085 = 995 X 583, где 906609 = 993 X 913 нашел его только применяя грубое форсирование сверху вниз!


вот мой код:

max_pal = 0
for i in range(100,999):
    for j in range(100,999):
      mult = i * j 
      if str(mult) == str(mult)[::-1]: #Check if the number is palindrome
          if mult > max_pal: 
              max_pal = mult
print (max_pal)

переосмысление: эффективность и производительность

def palindrome(n):    

    maxNumberWithNDigits = int('9' * n) #find the max number with n digits

    product = maxNumberWithNDigits * maxNumberWithNDigits 

    #Since we are looking the max, stop on the first match

    while True:        
        if str(product) == str(product)[::-1]: break;

        product-=1

    return product

start=time.time()
palindrome(3)
end=time.time()-start

палиндром...: 997799, 0.000138998031616 сек