Программа позволяет определить наибольший простой делитель числа 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)
→ Ссылка