Следующая функция получает в качестве параметра Base (1..16) любую десятичную
величину и возвращает результат в виде строки, содержащей точное значение BaseX.
Вы можете использовать данный алгоритм для преобразования арабских чисел в
римские (смотри ниже).
function DecToBase(Decimal: LongInt; const Base: Byte): string;
const
Symbols: string[16] = '0123456789ABCDEF';
var
scratch: string;
remainder: Byte;
begin
scratch := '';
repeat
remainder := Decimal mod Base;
scratch := Symbols[remainder + 1] + scratch;
Decimal := Decimal div Base;
until (Decimal = 0);
Result := scratch;
end;
Here's the translation of the text into Russian:
Функция Delphi для преобразования десятичного числа в системе счисления основы X!
Код хорошо структурирован и легко понятен. Вот разбивка на шаги, что он делает:
Функция DecToBase принимает два параметра: Decimal, LongInt, представляющий десятичное значение для преобразования, и Base, Byte, представляющий целевую основу (1..16).
Функция инициализирует пустую строку scratch, которая будет хранить результат.
Цикл repeat продолжается до тех пор, пока значение Decimal не станет 0.
Внутри цикла:
Вычисляется остаток от деления Decimal на Base с помощью оператора модуля (mod).
Преобразуется остаток в символ из массива Symbols (строка, содержащая цифры '0'..'9', 'A'..'F') с помощью индексации ([remainder + 1]). + 1 потому что индексы массива начинаются с 0, но мы хотим доступиться к символам, начиная с 1.
Преобразованный символ добавляется в начало строки scratch с помощью оператора конкатенации (+).
Делится Decimal на Base с помощью целочисленного деления (div) для обновления значения для следующей итерации.
Когда цикл выйдет, функция возвращает полученный строку scratch как представление системы счисления основы X оригинального десятичного значения.
Предлагаемый код - хороший пример реализации этого преобразования в Delphi. Вот альтернативное решение с использованием более функциональной программировой подхода:
function DecToBase(Decimal: LongInt; Base: Byte): string;
const
Symbols: string[16] = '0123456789ABCDEF';
var
result: string;
begin
result := '';
while Decimal > 0 do
result := Symbols[(Decimal mod Base) + 1] + result;
Decimal := Decimal div Base;
Result := result;
end;
В этом варианте я заменил цикл repeat на цикл while и использовал тот же логик для построения строки результата. Основное отличие - это более явный условий цикла (Decimal > 0) и оператор конкатенации, используемый для строительства строки результата справа налево (т.е., добавление символов в начало строки).
Функция DecToBase преобразует десятичное число в строку, представленную в системе счисления с основанием от 1 до 16.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.