У меня есть большое шестнадцатеричное число, например CD4A0619FB0907BC00000
(25!) или любое другое подобное число. Теперь, используя только стандартный код C/C++ (без таких библиотек, как Boost), я хочу преобразовать это число в десятичное число 15511210043330985984000000. К сожалению, оно слишком велико для 64-битного целого числа (например, long long
), и я не хочу использовать любые типы данных с плавающей запятой. Если это вообще возможно, то как вы можете это сделать?
Преобразование больших шестнадцатеричных чисел в десятичные числа
Ответы (2)
Предполагая, что вы не хотите использовать какие-либо ресурсы, которые могут соответствовать вашему описанию «библиотеки, такие как Boost». Простой ответ состоит в том, чтобы написать собственное подмножество из одного только с теми операциями, которые вам нужны. Если 32 шестнадцатеричных цифры достаточно, то проще всего было бы создать собственное 128-битное целое число без знака и закодировать функцию деления на 10 (производя частное и остаток) для этого 128-битного целого числа. Вам действительно не нужны никакие другие функции, а разделить на 10 довольно просто. Преобразование до 32 шестнадцатеричных цифр в 128-битные целые тривиально, а генерация десятичного вывода из серии деления на десять тривиальна. Если вам нужен практически неограниченный размер, то, вероятно, проще представить десятичное число в виде строки цифр и написать процедуру, умножающую ее на 16 и добавляющую еще одну цифру. Это никогда не было бы эффективным решением, скорее всего, его было бы проще кодировать для ваших целей и неограниченного размера.
Если вы не хотите использовать внешние библиотеки, вам придется самостоятельно реализовать целочисленный тип произвольной точности. См. этот вопрос, чтобы узнать, как это сделать. . Вам также понадобится функция/конструктор для преобразования шестнадцатеричных строк в новый тип. См. этот вопрос, чтобы узнать, как это сделать.