2016-12-29 10 views
-2

Я новичок в Python (и программирование), и я застрял в Проекте Эйлер 4. Проблема говорит:Project Euler 4 с питоном: Самый большой Palindrome продукт

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

Найти самый большой палиндром из продукта двух трехзначных чисел ».

Вот что я пришел так далеко:

ProductOfThree = [] 
ProductOfThreeSTR = [] 
PalindromicNumber = [] 
#This first for loop displays all the results possible from the product of two 3 digit Number 
for k in range(100, 1000): 
    for j in range(k, 1000): 
     Result = k * j 
     ProductOfThree.append(Result) 
#This second loop converts the list of number to a list of string 
for i in ProductOfThree: 
    a = str(i) 
    ProductOfThreeSTR.append(a) 
#The third loop compare the digit of each number of the list to find all the palindromic number of that list 
for d in ProductOfThreeSTR: 
    if len(d) == 6: 
     if (d[0] == d[5]) and (d[1] == d[4]) and (d[2] == d[3]): 
      PalindromicNumber.append(d) 
    elif len(d) == 5: 
     if (d[0] == d[4]) and (d[1] == d[3]): 
      PalindromicNumber.append(d) 
#And finally here the program display the largest number of the list, which contains only the palindromic numbers 
Largest = PalindromicNumber[0] 
for p in PalindromicNumber: 
    if Largest <= p: 
     Largest = p   
print(Largest) 

Программа отображает номер 99999. После повторного чтения программы я понял, что оператор if с len (d) == 5 бесполезен, потому что мы хотим отображать наибольшее число, а число с 6 цифрами всегда больше, чем число с пятью цифрами , После удаления этой части программы я получаю результат, который должен иметь (906609). Но мне все еще интересно, даже если мы пытаемся найти палиндромное число с 5 цифрами, обычно их следует игнорировать, когда мы будем отображать наибольшее количество списка, так почему он дает результат 99999?

ответ

0

Проблема в том, что в последнем цикле, когда вы ищете наибольшее значение, вы сравниваете строки вместо целых чисел. Сделайте это, и это даст вам результат вы ожидаете:

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

Согласно python docs сравнение строк использует лексикографический порядок:

Сравнение использует лексикографический порядок: сначала первые два пункта сравниваются, и если они различаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность.