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

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

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

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

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

Реализация

#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;
}

Результат выполнения

2016-04-29_14-03-37 2016-04-29_14-04-24


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

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

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