Пытался решить проект Эйлера, задача 4 на Python
В месте с ошибкой выдает "List index out of range", хотя через "else" должны проходить только шестизначные числа, а значит обращение к [5] должно нормально работать. Исправление [5] на [4] дает результат, следственно проблема в этом, но при такой замене теряется весь смысл.
def pal():
for i in range (100, 1000):
for x in range(100, 1000):
nums = [int(z) for z in str(x*i)]
if x*i % 10000 < 10:
if nums[0] == nums[3] and nums[1] == nums[4]:
pals.append(x*i)
else:
#ошибка здесь
if nums[0] == nums[5] and nums[1] == nums[4] and nums[2] == nums[3]:
pals.append(x*i)
pal()
print(pals)
Ответы (3 шт):
Ошибка в индексации массива, довольно большое количество чисел будут пятизначными.
Ошибки можно избежать, если упростить код. Проверять на палиндром можно сравнением строки с её перевёрнутой копией. Также можно уменьшить количество итераций вложенного цикла, если начинать их с i.
Пример:
m = 0
for i in range(100, 1000):
for j in range(i, 1000):
x = str(i*j)
if x == x[::-1] and int(x) > m:
m = int(x)
print(m)
stdout:
906609
lst = []
for i in range(100, 1000):
for j in range(100, 1000):
s = str(i * j)
if s == s[::-1]:
lst.append(int(s))
print(max(lst))
Если написали "через "else" должны проходить только шестизначные числа", то надо отобразить это в коде. Вот так:
...
else:
assert len(nums) == 6
if nums[0] == nums[5] and nums[1] == nums[4] and nums[2] == nums[3]:
...
А как assert упадет, искать ошибки - почему ваше предположение и реальность расходятся.