TookserЖелание сократить число перебираемых вариантов - это правильное желание. Все остальное, что у вас есть - неправильно
Во-первых, в задаче сказано про трехзначные числа, так что 1000 отпадает. 100 тоже можно откинуть, совершенно очевидно, что ничего толкового с сотней не выйдет. Хотя я не знаю питон, так что если конструкция
for i in range(100,1000): означает перебор числел от 101 до 999 - то ок.
Во-вторых, мы ищем максимум. Поэтому начинать надо с 999 и идти вниз.
В-третьих, умножение коммутативно, поэтому цикл по
j надо начинать не с 999, а с
i.
Далее, когда найден хотя бы один палиндром (допустим, при значениях
i1 и
j1), не имеет смысла продолжать цикл по
i до 101. Достаточно дойти до
j1, все остальные произведения будут заведомо меньше.
-- 07.07.2017, 11:12 --Кстати, есть способ еще круче, но немного менее очевидный.
Перебираем числа, начиная с 1998. Цикл выглядит примерно так (на паскале напишу, он довольно понятный, а питон я не знаю):
s := 1998; p := 0; // p - искомое произведение
while p = 0 do
begin
i := 999;
j := s - i;
while (j <= i) and (p = 0) do
begin
if {i * j является палиндромом} then p := i * j;
inc(j); // увеличение на единицу
dec(i); // уменьшение на единицу
end;
dec(s);
end;
Число перебираемых вариантов меньше и первое найденное произведение будет гарантированно наибольшим.