2012-10-01 13 views
6

nel Problema 4 da http://projecteuler.net/ si dice:più alto palindromo con 3 numeri a due cifre in pitone

Un numero palindromo si legge la stessa in entrambi i modi. Il più grande palindromo ricavato dal prodotto di due numeri a due cifre è 9009 = 91 * 99.

Trova il palindromo più grande realizzato con due numeri a 3 cifre.

Ho questo codice qui

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) 

Dovrebbe trovare il più grande palindromo, sputa fuori 580085 che credo di essere corretto, ma Project Euler non la pensa così, devo qualcosa di sbagliato Qui?


Quando ho venerato il ciclo for non pensavo che attraverso, ho rimosso la cosa che controlla la più grande, mi sciocca. Heres il codice di lavoro

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) 

sputa fuori 906609

+1

FYI la risposta è '906609' –

+0

Con quali numeri? – FabianCook

+0

Perché ho ottenuto 995 * 583 = 580085 – FabianCook

risposta

8

Iterazione al contrario non trova la più grande x*y, trova il palindromo con il maggior x. C'è una risposta più ampia di 580085; ha un x più piccolo ma uno più grande .

+0

Hmm, lasciamo cambiare questo intorno un po ', brb. – FabianCook

+0

concordato. Invece di tornare non appena trovi un palindromo, devi testare ogni combinazione e tenere traccia del più grande. Sfere – japreiss

+0

. Qui andiamo – FabianCook

4

Questo sarebbe più efficiente essere scritta come:

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) 

Troverete itertools e generatori molto utile se si sta facendo di Eulero in Python.

+0

Il mio semplice codice funziona abbastanza velocemente per me :) – FabianCook

+0

Im solo usando python per questo perché è un linguaggio interpretato, altrimenti userei java – FabianCook

+0

@SmartLemon abbastanza giusto - Haskell è molto utile pure se;) –

1

provato rendendolo più efficiente, pur mantenendo leggibile:

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: efficienza e le prestazioni

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 

palindromo ...: 997.799, 0.000138998031616 secondi

+2

Il palindrome 997799 non è un prodotto di due numeri a 3 cifre, ha 11 e 90709 come fattori primi. – rakvium

2

Non il più risposta efficiente ma mi piace che sia abbastanza compatto da stare su una sola riga.

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

Qui ho aggiunto due "interruzioni" per migliorare la velocità di questo programma.

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

I commenti per chiarire il tuo codice sono molto apprezzati – olyv

0

Semplice:

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

Ogni volta che doesnot devono partire da 999 in quanto è già trovato earlier.Below è un metodo semplice utilizzando la funzione di stringa per trovare più grande palindromo utilizzando il numero a tre cifre

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

Ecco il mio codice per risolvere questo 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, dove 906.609 = 993 X 913 trovato solo applicando bruta costringendo da cima a fondo!

0

Ecco il mio codice 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

Sarebbe utile aggiungere alcune righe annotando/spiegando il tuo approccio. – Yannis

Problemi correlati