Представление в другой системе счисления

Алгоритмизация / Представление в другой системе счисления

 

Поскольку многоразрядное число представляет собой массив байтов, вывод его в другой системе счисления связан с переводом введенного числа в представление в требуемой системе счисления.

Процедура перевода чисел в различные системы счисления описана здесь.

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

Еще одной сложностью при получении символьного представления числа в шестнадцатеричной системе счисления является отображение символов латинских букв A...F.
Коды символов букв не следуют непосредственно за кодами символов цифр, поэтому для перевода остатка от деления в символьное представление удобно использовать дополнительную функцию.

Подробнее кодировка символов рассмотрена здесь.

Для получение общей функции перевода будем передавать в функцию два основания - основания исходной и искомой систем счисления

Реализация на С++

1
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
#include <iostream>
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;
}

Результат выполнения
Представление многоразрядных чисел в другой системе счисления
Представление многоразрядных чисел в другой системе счисления


Назад: Алгоритмизация

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *