2012-10-01 100 views
6

en el problema 4 de http://projecteuler.net/ dice:mayor palíndromo con números de 3 dígitos en pitón

Un capicúa se lee igual en ambos sentidos. El palíndromo más grande hecho a partir del producto de dos números de 2 dígitos es 9009 = 91 * 99.

Encuentra el palíndromo más grande hecho a partir del producto de dos números de 3 dígitos.

tengo este código aquí

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) 

Se debe encontrar el mayor palíndromo, se escupe 580085 que creo que es correcta, pero Euler proyecto no lo cree así, ¿tengo algo mal ¿aquí?


Cuando reverencié el bucle for que no creían que fuera a través, quité lo que comprueba la más grande, tonto de mí. Aquí está el código de trabajo

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) 

escupe 906609

+1

FYI la respuesta es '906609' –

+0

Por qué números? – FabianCook

+0

Porque tengo 995 * 583 = 580085 – FabianCook

Respuesta

8

iteración a la inversa no encuentra el mayor x*y, se encuentra el palíndromo con el mayor x. Hay una respuesta más grande que 580085; tiene un x más pequeño pero un y más grande.

+0

Hmm, vamos a cambiar esto un poco, brb. – FabianCook

+0

De acuerdo. En lugar de regresar tan pronto como encuentre un palíndromo, debe probar cada combinación y realizar un seguimiento de la más grande. – japreiss

+0

Bolas. Aquí vamos – FabianCook

4

Esto sería más eficiente puede escribir como:

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) 

Encontrará itertools y generadores de gran utilidad si estás haciendo Euler en Python.

+0

Mi código simple funciona lo suficientemente rápido para mí :) – FabianCook

+0

Solo estoy usando Python para esto porque es un lenguaje interpretado, de lo contrario usaría java – FabianCook

+0

@SmartLemon lo suficientemente justo - Haskell es muy útil también;) –

1

intentado hacer que sea más eficiente, mientras se mantiene legible:

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) 
-1

ReThink: eficiencia y el rendimiento

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 

palíndromo ...: 997.799, 0.000138998031616 segundos

+2

El palíndromo 997799 no es un producto de dos números de 3 dígitos, tiene 11 y 90709 como factores primos. – rakvium

2

No es el más respuesta eficiente, pero me gusta que sea lo suficientemente compacto como para caber en una línea.

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

Aquí agregué dos 'break' para mejorar la velocidad de este programa.

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) 
+1

Los comentarios para aclarar su código son muy apreciados – olyv

0

simple:

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 
0

Cada vez que doesnot tener que empezar de 999, ya que se encuentra ya earlier.Below es un método simple usando función de cadena para encontrar mayor palíndromo utilizando el número de tres dígitos

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 
0

Aquí está mi código para resolver este problema.

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) 
0

580085 = 995 X 583, donde 906 609 = 993 X 913 encontró que sólo mediante la aplicación de fuerza bruta de arriba a abajo!

0

Aquí está mi código Python:

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) 
+0

Sería útil agregar algunas líneas que indiquen/expliquen su enfoque. – Yannis

Cuestiones relacionadas