Почему если убрать эти строки кода (помечены цифрами 1,2,3), то ответ будет 99, а если оставить то 9009? answ всегда же равно 0
function Check (x)
local check_x = x
local revers_x = 0
while (check_x > 0) do
revers_x = revers_x * 10
revers_x = revers_x + math.fmod(check_x, 10)
check_x = check_x // 10
end
return revers_x == x
end
local x = 0
local answ = 0
for i = 99, 1, -1 do
for j = 99, 1, -1 do
x = i * j
if (answ > x) then <--1
break <--2
end <--3
if (Check(x) == true) then
answ = x
break
end
end
end
print(answ)
Ответы (1 шт):
Я в lua не понимаю ни грамма, но это вопрос больше о понимании концепции программирования. Сначала вы определяете revers_x = 0. Далее у вас идёт цикл while с условием check_x > 0, которое не выполняется (Думаю, объяснять "почему?" не стоит).
Вот это, на сколько я понимаю, обратные циклы, которые будут идти от 99 до 1 с шагом -1. За каждую итерацию у вас x присваивается значение i * j, т.е., уже на первой итерации x = i * j = 99 * 99 = 9801
Далее идёт проверка, если ваш answ, который в этот момент равен 0, больше произведения i на j, т.е. 9801, что, конечно же, не так. После этого идёт вызов функции Check, которая делает проверку, является ли число палиндромом. Если да, значит результат присваивается в переменную answ.
Самый первый палиндром при таких начальных значениях (99 для i, и 99 для j) является 9009, т.е. когда i = 99, j = 91.
После этого, во всех следующих итерациях будет выполняться проверка if (answ > x), т.е., больше ли уже записанный палиндром произведения при следующих итерациях (Что, конечно же не так, поскольку все следующие палиндромы будут меньше). Если да, значит действие цикла прекращается, и управление кодом не доходит до строчки if (Check(x) == true).
Если эту проверку просто убрать, значит вы будете каждый раз опять проверять, является ли число палиндромом, и если это так, вы будете обновлять переменную answ до того момента, пока она не станет равная 1