Мне нужна функция базового преобразователя для Lua. Мне нужно конвертировать из базы 10 в базу 2,3,4,5,6,7,8,9,10,11 ... 36 как мне это сделать?
В направлении строка
к число
функция tonumber ()
принимает необязательный второй аргумент, который указывает основание для use, который может находиться в диапазоне от 2 до 36 с очевидным значением для цифр в основаниях больше 10.
В направлении числа к строке это можно сделать немного более эффективно, чем ответ Николауса чем-то вроде this:
local floor,insert = math.floor, table.insert function basen(n,b) n = floor(n) if not b or b == 10 then return tostring(n) end local digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" local t = {} local sign = "" if n < 0 then sign = "-" n = -n end repeat local d = (n % b) + 1 n = floor(n / b) insert(t, 1, digits:sub(d,d)) until n == 0 return sign .. table.concat(t,"") end
Это создает меньше строк мусора для сбора за счет использования table.concat ()
вместо повторных вызовов оператора конкатенации строк ..
. Хотя это не имеет большого практического значения для таких маленьких строк, эту идиому следует изучить, потому что в противном случае построение буфера в цикле с оператором конкатенации фактически будет иметь тенденцию к производительности O (n 2 ) при использовании таблицы . concat ()
был разработан, чтобы работать лучше.
Остается без ответа вопрос, является ли более эффективным помещать цифры в стек в таблице t
с вызовами table.insert (t, 1, digit)
или добавить их в конец с помощью t [# t + 1] = digit
с последующим вызовом string.reverse ()
для размещения цифр в правильном порядке. . Я оставлю тестирование студенту. Обратите внимание: хотя код, который я здесь вставил, работает и дает правильные ответы, могут быть другие возможности для его дальнейшей настройки.
Например, обычный случай с основанием 10 отбирается и обрабатывается с помощью встроенной функции tostring ()
. Но аналогичные отбраковки могут быть выполнены для баз 8 и 16, которые имеют спецификаторы преобразования для string.format ()
( «% o»
и «% x»
, соответственно).
Кроме того, ни решение Николауса, ни мое не особенно хорошо справляются с нецелыми числами. Я подчеркиваю, что здесь значение n
превращается в целое число с math.floor ()
в начале.
Правильное преобразование общего значения с плавающей запятой в любое основание (даже основание 10) чревато тонкостями, которые я оставляю читателю в качестве упражнения.
вы можете использовать цикл для преобразования целого числа в строку, содержащую требуемое основание. для баз ниже 10 используйте следующий код, если вам нужна база большего размера, вам нужно добавить строку, которая сопоставляет результат x% base с символом (например, используйте массив)
x = 1234
r = ""
base = 8
while x > 0 do
r = "" .. (x % base ) .. r
x = math.floor(x / base)
end
print( r );