在Lua中排序,计算项目数

时间:2010-05-04 07:51:27

标签: sorting lua

使用以下代码的两个快速问题(我希望...)。下面的脚本检查一个数字是否为素数,如果不是,则返回该数字的所有因子,否则它只返回数字素数。不要理会zs。脚本中的内容,因为它是特定于客户端的,并且与脚本功能无关。

脚本本身几乎完美无缺,除了两个小细节 - 第一个是因子列表没有返回自己排序...也就是说,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 个答案:

答案 0 :(得分:3)

如果我理解你的问题,我建议你稍微分解你的逻辑。我们的想法是首先创建一个包含分数的表,然后进行排序,然后创建字符串表示。

-- 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, ", ")

答案 1 :(得分:2)

来自ponzao的很好的ansewr。要对结果进行最后润色,这里是一个通用例程,用于将Lua中的字符串列表转换为英语字符串,使用“and”表示列表:

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)