Что такое эффективный способ получить цифровую цифру boost::multiprecision::cpp_int
? Функция log10()
, по-видимому, не совместима с целыми целыми целыми числами, и я не могу найти другого способа сделать это.Digit-count of boost :: multiprecision :: cpp_int
2
A
ответ
0
Если преобразование в cpp_dec_float не требуется (я не угадываю) можно разделить на 10:
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
using Int = boost::multiprecision::cpp_int;
using Float = boost::multiprecision::cpp_dec_float_50;
int main() {
Int demo("12345678912345678");
int digits = 0;
for (Int tmp = abs(demo); tmp > 0; tmp /= 10)
digits += 1;
std::cout << digits << ", " << ceil(log10(Float(demo))) << "\n";
}
Это может возможно быть оптимизирована для очень большие целые числа (начиная с делителя 1000000, например, до тех пор, пока значение не станет меньше этого делителя). Я бы позволил моим профилировщикам вести такую оптимизацию (так как легко получить неправильный результат).
2
Вы можете использовать .str().size()
.
const cpp_int n = cpp_int("123456789") * cpp_int("987654321");
const size_t digits = n.str().size(); // digits == 18
Это выглядит расточительно, но быстрее, чем любой log10 или делением на 10.