Другие языки программирования и технологии

Как написать программу для перевода числа с 8-ричной в 16-ричную систему? (язык Pascal или delphi в крайнем случае C++)

Евгений Сухов
Евгений Сухов
1 006
Доброго времени суток.

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

Пример: 37(8) -> 011 111 -> 01 1111 -> 1F(16)

Удобно объявить пару констант

const
arrOct : array[0..7] of String[3] = ('000','001','010','011','100','101','110','111');
arrHex : array[0..15] of String[4] = ('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111');

Дальше вводите восьмеричное число как строку, допустим, в переменную S8 и в цикле от длины строки до 1 формируете промежуточное двоичное число в переменной S2

S2 := '';
for i:=Length(S8) do S2 := arrOct[Ord(S8[ i ])-Ord('0')] + S2;

А затем читаете по 4 разряда из строки S2 начиная с конца и ищите в массиве arrHex соответсвующий элемент. Индекс этого элемента и будет шестнадцатиричной цифрой. Нужно только не забыть преобразовать индексы от 10 до 15 в символы от А до F. Это предлагаю сделать самостоятельно. И заметьте, никаких умножений / делений. Только выборка из строки.

Преимущество такого алгоритма перед другими, использующими числа, в отсутствии ограничений на разрядность преобразуемых чисел. Нет здесь частных и произведений. Есть только ограничение на длину строки в 255 символов, но 2^255 достаточно большое число для удовлетворения большинства потребностей.

Удачи!
Vladimir Stolar
Vladimir Stolar
59 613
Лучший ответ
Филипп Писаренко Это через строки, что ли? Попахивает диким извратом.
не понимаю в чем сложность, но за 1wmr сделаю если хош
Maks 78
Maks 78
7 837
#include <stdio.h>

int main()
{
unsigned n;
scanf("%o", &n);
printf("%x", n);
return 0;
}
Vladimir Stolar Смотрим на порядок предпочтения - "язык Pascal или delphi в крайнем случае C++"
1.переводим в десятичную
переменная = первый знак.
если есть еще знаки? (
"переменная" * основание
"переменная" = переменная + следующий знак
)

2. перевод из десятичной
делим на основание, остаток пишем в начало переменной "результат" (если надо - преобразуем в символ 10 - а 11 - b и т. д. )
частное равно нулю? если да - то конец
иначе - снова, но уже с частным.

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