Базовый конвертер Lua

Мне нужна функция базового преобразователя для Lua. Мне нужно конвертировать из базы 10 в базу 2,3,4,5,6,7,8,9,10,11 ... 36 как мне это сделать?

6
задан RBerteig 24 August 2010 в 07:55
поделиться

2 ответа

В направлении строка к число функция 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) чревато тонкостями, которые я оставляю читателю в качестве упражнения.

14
ответ дан 8 December 2019 в 13:43
поделиться

вы можете использовать цикл для преобразования целого числа в строку, содержащую требуемое основание. для баз ниже 10 используйте следующий код, если вам нужна база большего размера, вам нужно добавить строку, которая сопоставляет результат x% base с символом (например, используйте массив)

x = 1234
r = ""
base = 8

while x > 0 do
    r = "" ..  (x % base ) .. r
    x = math.floor(x / base)
end
print( r );
3
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: