Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, полученный из продукта двух двузначных чисел, составляет 9009 = 91 × 99.
Найти самый большой палиндром, изготовленный из продукта двух 3-значных чисел.Euler # 4 in Python
Ниже мое решение этой проблемы. Это работает, но я заметил другое решение, которое используется
if x*y < max_seen: continue
так:
def biggest():
big_x, big_y, max_seen = 0, 0, 0
for x in xrange(999,99,-1):
for y in xrange(x, 99,-1):
if x*y < max_seen: continue
if is_palindrome(x*y):
big_x, big_y, max_seen = x,y, x*y
То, что я не получаю, как работает эта линия. Первый раз через max_seen = 0
и первый x*y
равен 999*999
, который больше 0. Таким образом, условие не выполняется и выполняется следующая строка. Имеет смысл. В конце концов, однако, max_seen
будет больше x*y
, так почему же он continue
здесь?
Кажется, эта строка даже не нужна, потому что если условие выполнено или не выполнено, программа будет продолжена в любом случае. Я подозреваю, что не понимаю, как работает continue
в Python.
Это мой подход:
def find_biggest():
big_x, big_y, new_pal, max_seen = 0, 0, 0, 0
for x in range(999, 100, -1):
for y in range(x, 100, -1):
if is_palindrome(x*y) == True:
new_pal = x*y
if new_pal > max_seen:
big_x, big_y, max_seen = x, y, new_pal
С точки зрения эффективности, программа должна выйти, как только все новые x*y
являются < max_seen
, но 999*100
меньше 998*900
(то есть он еще не мог остановить как это до сих пор необходимо проверить 998*y
, 997*y
и т. д.), так как бы вы это закодировали?
Не уверен, если я должен начать новый вопрос или нет, но просто интересно почему тест is_pal1 медленнее, чем is_pal2, который, кажется, делает больше вещей. 'def is_pal1 (n): , если str (n) == str (n) [:: - 1]: return True def is_pal2 (n): s0 = str (n) s1 = s0 [:: -1] если s0 == s1: return True'. Хммм, это не печатает хорошо. Сожалею. – caadrider