Сортировка в Lua, подсчет количества предметов - PullRequest
0 голосов
/ 04 мая 2010

Два быстрых вопроса (надеюсь ...) со следующим кодом. Приведенный ниже скрипт проверяет, является ли число простым, и если нет, возвращает все факторы для этого числа, в противном случае он просто возвращает это число простое. Не обращай внимания на з.ы. материал в сценарии, поскольку это зависит от клиента и не имеет отношения к функциональности сценария.

Сам сценарий работает почти замечательно, за исключением двух незначительных деталей - первая из них состоит в том, что список факторов не возвращает себя отсортированным ... то есть для 24 он возвращает 1, 2, 12, 3, 8 , 4, 6 и 24 вместо 1, 2, 3, 4, 6, 8, 12 и 24. Я не могу напечатать его в виде таблицы, поэтому его нужно вернуть в виде списка. Если он должен быть отсортирован в виде таблицы, ТОГДА превращенной в список, я могу с этим справиться. Все, что имеет значение, является конечным результатом, являющимся списком.

Другая деталь в том, что мне нужно проверить, есть ли в списке только два числа или больше. Если есть только два числа, это простое число (1 и число). Текущий способ у меня это не работает. Есть ли способ сделать это? Я ценю всю помощь!

function get_all_factors(number)
  local factors = 1
  for possible_factor=2, math.sqrt(number), 1 do
    local remainder = number%possible_factor

    if remainder == 0 then
      local factor, factor_pair = possible_factor, number/possible_factor
      factors = factors .. ", " .. factor
      if factor ~= factor_pair then
        factors = factors .. ", " ..  factor_pair
      end
    end
  end

  factors = factors .. ", and " .. number
  return factors
end

local allfactors = get_all_factors(zs.param(1))
if zs.func.numitems(allfactors)==2 then
  return zs.param(1) .. " is prime."
else
  return zs.param(1) .. " is not prime, and its factors are: " .. allfactors
end

Ответы [ 2 ]

3 голосов
/ 04 мая 2010

Если я правильно понял вашу проблему, я рекомендую немного разделить вашу логику. Идея состоит в том, чтобы сначала создать таблицу, содержащую дроби, а затем выполнить сортировку, а затем создать строковое представление.

-- Creates a table containing all the factors for a number.
function createFactors(n)
    local factors = {}
    -- The for loop etc. would be here. If you find a factor then add
    -- it in the table.
    -- ...
    table.insert(factors, n)
    -- ...
    --# Once you've found all the factors just return the table.
    return factors
end

-- Lua offers a method for sorting tables called table.sort.
local factors = createFactors(139)
table.sort(factors)

-- There is a method for creating a string representation of a table
-- called table.concat, the first parameter is the table and the second
-- is the character that is used to delimit the values.
table.concat(factors, ", ")
2 голосов
/ 05 мая 2010

Хороший ответ от Понзао. Чтобы завершить ваш результат, вот стандартная процедура для преобразования списка строк в Lua в английскую строку с "и", представляющим список:

function string.commafy(t, andword)
  andword = andword or 'and'
  local n = #t
  if n == 1 then
    return t[1]
  elseif n == 2 then
    return table.concat { t[1], ' ', andword, ' ', t[2] }
  else
    local last = t[n]
    t[n] = andword .. ' ' .. t[n]
    local answer = table.concat(t, ', ')
    t[n] = last
    return answer
  end
end

Вместо table.concat(factors, ', ') используйте string.commafy(factors).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...