Предполагая, что вы уже реализованы функции для выполнения математику на uint128
, можно разбить число вверх в 3 части и использовать встроенный в 64-битном возможности печати printf. Поскольку lar gest 64-битное число составляет 20 цифр, это означает, что все 19-значные десятичные числа могут быть напечатаны таким образом, но поскольку наибольшее 128-битное число составляет 39 цифр, мы не можем разбить его на две части, поскольку есть вероятность, что мы получим 20-значное число, большее, чем самое большое 64-битное число.
Это один из способов сделать это, разделив сначала на 10 , чтобы получить коэффициент не более 3,402,823,669,209,384,634. Затем мы разделим остаток (сам по себе не более 10) на 10 , чтобы получить другое частное и остальное каждый менее 10 , которые оба подходят в 64-битовом целое.
void print_uint128(uint128 value)
{
// First power of 10 larger than 2^64
static const uint128 tenToThe20 = {7766279631452241920ull, 5ull};
static const uint128 tenToThe10 = {10000000000ull, 0ull};
// Do a 128-bit division; assume we have functions to divide, multiply, and
// subtract 128-bit numbers
uint128 quotient1 = div128(value, tenToThe20);
uint128 remainder1 = sub128(value, mul128(quotient, tenToThe20));
uint128 quotient2 = div128(remainder1, tenToThe10);
uint128 remainder2 = sub128(remainder1, mul128(remainder1, tenToThe10));
// Now print out theresult in 3 parts, being careful not to print
// unnecessary leading 0's
if(quotient1.low != 0)
printf("%llu%010llu%010llu", quotient1.low, quotient2.low, remainder2.low);
else if(quotient2.low != 0)
printf("%llu%010llu", quotient2.low, remainder2.low);
else
printf("%llu", remainder2.low);
}
В какой ОС вы работаете? Например, Solaris имеет встроенную большую целую библиотеку. Вы также можете использовать Google для библиотеки BIGNUM. – 2010-12-05 22:26:01
GCC 4.6.0 будет иметь [__int128] (http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html). – ephemient 2010-12-05 22:30:40
Я предпочитаю решения, независимые от платформы и компилятора. – Cephalopod 2010-12-06 10:06:36