2012-10-01 4 views
6

In Problem 4 von http://projecteuler.net/ heißt es:höchster Palindrom mit 3-stelligen Zahlen in Python

A Zahlenpalindrom liest das in beiden Richtungen gleich. Das größte aus dem Produkt zweier zweistelliger Zahlen hergestellte Palindrom ist 9009 = 91 * 99.

Finden Sie das größte Palindrom, das aus dem Produkt zweier dreistelliger Zahlen besteht.

Ich habe diesen Code hier

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) 

Es sollte die größte Palindrom finden, es spuckt 580085 was ich glaube, um korrekt zu sein, aber Project Euler nicht so denken, muss ich etwas falsch gemacht haben Hier?


Als ich verehrte die for-Schleife habe ich denke, dass es nicht durch, entfernte ich die Sache, die für den größten prüft, albern mich. Heres der Arbeitscode

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) 

spuckt es 906609

+1

FYI die Antwort '906609' –

+0

Wodurch Zahlen? – FabianCook

+0

Weil ich bekam 995 * 583 = 580085 – FabianCook

Antwort

8

Iterieren in umgekehrter Richtung nicht aus, die größte x*y finden, ist es das Palindrom mit dem größten x findet. Es gibt eine größere Antwort als 580085; es hat eine kleinere x aber eine größere y.

+0

Hmm, lassen Sie das ein bisschen ändern, brb. – FabianCook

+0

Einverstanden. Anstatt zurückzukommen, sobald Sie ein Palindrom gefunden haben, müssen Sie jede Kombination testen und den größten Überblick behalten. – japreiss

+0

Bälle. Hier gehen wir – FabianCook

4

Dies wäre effizienter geschrieben werden als:

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) 

Sie itertools und Generatoren finden sehr nützlich, wenn Sie Euler in Python tun.

+0

Mein einfacher Code funktioniert schnell genug für mich :) – FabianCook

+0

Ich benutze nur Python für diese, weil es eine interpretierte Sprache ist, sonst würde ich Java verwenden – FabianCook

+0

@SmartLemon fair genug - Haskell ist sehr nützlich auch wenn;) –

1

Versuchte es effizienter zu machen, während sie lesbar zu halten:

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: Effizienz und Leistung

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 

Palindrom ...: 997.799, ,000138998031616 Sekunden

+2

Das Palindrom 997799 ist kein Produkt von zwei 3-stelligen Zahlen, es hat 11 und 90709 als Primfaktoren. – rakvium

2

Nicht die effiziente Antwort, aber ich mag es, dass es kompakt genug ist, um auf einer Linie zu passen.

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

Hier habe ich zwei "Pause" hinzugefügt, um die Geschwindigkeit dieses Programms zu verbessern.

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

Kommentare zur Verdeutlichung Ihres Codes werden sehr geschätzt – olyv

0

Ganz einfach:

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

Jedes Mal, es muss von 999 beginnen doesnot wie es bereits gefunden earlier.Below eine einfache Methode ist String-Funktion größten Palindrom mit dreistelliger Zahl finden

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

Hier ist mein Code, um dieses Problem zu lösen.

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, wo 906.609 = 993 X 913 es nur von oben nach unten zu zwingen, indem Brute gefunden!

0

Hier ist mein Python-Code:

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

Es wäre nützlich, ein paar Zeilen hinzuzufügen, die Ihren Ansatz verdeutlichen. – Yannis

Verwandte Themen