Программа позволяет определить наибольший простой делитель числа 100, но если ее запустить - впадает в бесконечный цикл. Не пойму что не так
local x = 100
local g = 0
local prost = 2
local sq_x = math.sqrt(x) + 1
sq_x = math.floor(sq_x)
while (prost < sq_x) do
print("P: "..prost)
for i = prost, sq_x, 1 do
if ( x % i == 0 ) then
g = x / i
sq_x = math.sqrt(g) + 1
sq_x = math.floor(sq_x)
end
end
end
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Ваш код починить нелегко. Тут много деталей, которые цепляются друг за друга. Например: prost
всегда равен двум. А g
никогда не опускается ниже пятидесяти. То есть, оба числа в условии while
(это prost
и sq_x
, который зависит от g
) никогда не сойдутся, и цикл будет вечным.
Что-то такое должно работать. Здесь на каждой итерации внешнего while
происходят две вещи: p
обязательно увеличивается, sqrt_n
обязательно уменьшается. То есть, цикл всегда завершается.
local n = 100 -- ищем максимальный простой делитель n
local p = 1 -- будет перебирать все простые делители n
while (n > 1) do
local q = n -- следующий простой делитель n
for i = p + 1, math.floor(math.sqrt(n)) do
if (n % i == 0) then
q = i
break
end
end
p = q -- следующий простой делитель n
-- убираем из n все делители p
while (n % p == 0) do
n = n // p
end
end
print(p)