Поскольку многоразрядное число представляет собой массив байтов, вывод его в другой системе счисления связан с переводом введенного числа в представление в требуемой системе счисления.
Процедура перевода чисел в различные системы счисления описана здесь.
Поскольку для записи числа в требуемой системе счисления остатки от деления записываются в обратном порядке, функцию перевода числа удобно реализовать рекурсивно.
Еще одной сложностью при получении символьного представления числа в шестнадцатеричной системе счисления является отображение символов латинских букв A...F.
Коды символов букв не следуют непосредственно за кодами символов цифр, поэтому для перевода остатка от деления в символьное представление удобно использовать дополнительную функцию.
Подробнее кодировка символов рассмотрена здесь.
Для получение общей функции перевода будем передавать в функцию два основания - основания исходной и искомой систем счисления
Реализация на С++
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using namespace std;
// Перевод цифры от 0 до F в символьное представление
char digittochar(int num)
{
switch (num)
{
case 0: return '0';
case 1: return '1';
case 2: return '2';
case 3: return '3';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return '7';
case 8: return '8';
case 9: return '9';
case 10: return 'A';
case 11: return 'B';
case 12: return 'C';
case 13: return 'D';
case 14: return 'E';
case 15: return 'F';
}
}
// Перевод символа от '0' до 'F' в цифру
int digittoint(char num)
{
switch (num)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
}
}
// Функция перевода символьного представления q-ичного числа в систему счисления с основанием p
// с - полученное представление числа
// (передается через указатель и будет использоваться после вызова функции)
// q - основание исходной системы счисления
// p - основание искомой системы счисления
int dectox(char *a, int q, int p, char *c)
{
int rest = 0; // остаток от деления
char *s; // символьное десятичное представление частного a/p
int lena = strlen(a);
s = new char[lena];
int flag = 0; // проверка на нулевой результат в частном
for (int i = 0; i < lena; i++)
{
int dig = a[i] > 0 ? digittoint(a[i]) : 0;
int num = rest*q + dig; // делимое на текущем шаге
s[i] = digittochar(num / p); // следующий разряд частного
rest = num % p; // остаток от деления
if (s[i] != '0') flag = 1; // в случае ненулевого результата установить флаг
}
if (flag == 0) // частное равно 0, базовый случай рекурсии
{
c[0] = digittochar(rest); return 1; // запись старшего разряда результата
}
s[lena] = '\0'; // заканчиваем полученную строку результата
int k = dectox(s, q, p, c); // рекурсивный вызов для следующего разряда
c[k++] = digittochar(rest); // заполнение текущего разряда результата
return k;
}
int main()
{
char a[1000] = { 0 };
char c[1000] = { 0 };
cout << "a = ";
cin.getline(a, 1000);
dectox(a, 10, 16, c);
cout << c << endl;
cin.get();
return 0;
}
Результат выполнения

