2015-02-08 8 views
2

Что такое эффективный способ получить цифровую цифру boost::multiprecision::cpp_int? Функция log10(), по-видимому, не совместима с целыми целыми целыми числами, и я не могу найти другого способа сделать это.Digit-count of boost :: multiprecision :: cpp_int

ответ

0

Если преобразование в cpp_dec_float не требуется (я не угадываю) можно разделить на 10:

Live On Coliru

#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, например, до тех пор, пока значение не станет меньше этого делителя). Я бы позволил моим профилировщикам вести такую ​​оптимизацию (так как легко получить неправильный результат).


C++ Boost multiprecision cpp_int

2

Вы можете использовать .str().size().

const cpp_int n = cpp_int("123456789") * cpp_int("987654321"); 
const size_t digits = n.str().size(); // digits == 18 

Это выглядит расточительно, но быстрее, чем любой log10 или делением на 10.

 Смежные вопросы

  • Нет связанных вопросов^_^