Предполагая, что вы уже реализовали функции для выполнения математических операций на uint128
, вы можете разбить число на 3 части и использовать встроенные 64-битные возможности печати printf.Поскольку наибольшее 64-разрядное число имеет длину 20 цифр, это означает, что все 19-разрядные десятичные числа могут быть напечатаны таким образом, но поскольку наибольшее 128-разрядное число имеет длину 39 цифр, мы не можем разбить его только на 2 части., поскольку есть вероятность, что мы можем получить 20-значное число, большее, чем наибольшее 64-разрядное число.
Вот один из способов сделать это, сначала разделив его на 10 20 , чтобы получитькоэффициент не более 3 402 823 669 209 384 634.Затем мы делим остаток (сам по себе не более 10 20 ) на 10 10 , чтобы получить другой коэффициент и остаток, каждый из которых меньше 10 20 , которые оба соответствуют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);
}