Как преобразовать произвольное большое целое число из базы 10 в базу 16?
Программа требует ввода произвольного большого целого числа без знака, которое выражается одной строкой в базе 10. Выходными данными является другая строка, которая выражает целое число в базе 16.
Например, вход «1234567890987654321234567890987654321234567890987654321», а выход «CE3B5A137DD015278E09864703E4FF9952FF6B62C1CB1»
Чем быстрее алгоритм, тем лучше.
Это будет очень легко, если ввод ограничен 32-битным или 64-битным целым числом; например, следующий код может выполнить преобразование:
#define MAX_BUFFER 16
char hex[] = "0123456789ABCDEF";
char* dec2hex(unsigned input) {
char buff[MAX_BUFFER];
int i = 0, j = 0;
char* output;
if (input == 0) {
buff[0] = hex[0];
i = 1;
} else {
while (input) {
buff[i++] = hex[input % 16];
input = input / 16;
}
}
output = malloc((i + 1) * sizeof(char));
if (!output)
return NULL;
while (i > 0) {
output[j++] = buff[--i];
}
output[j] = '\0';
return output;
}
Реальная сложная часть - «произвольно большое» целое число без знака. Я гуглил, но большинство из них говорят о преобразовании в 32-разрядной или 64-разрядной версии. Не удача найдена.
Кто-нибудь может дать какой-нибудь хит или любую ссылку, на которую можно прочитать?
Заранее спасибо.
редактировать Это вопрос интервью, с которым я столкнулся недавно. Кто-нибудь может кратко объяснить, как решить эту проблему? Я знаю, что есть библиотека gmp, и я использовал ее раньше; однако в качестве вопроса для собеседования требуется не использовать внешнюю библиотеку.