boost :: multiprecision :: cpp_int的数字计数

时间:2015-02-08 16:26:08

标签: boost digit multiprecision

获得boost::multiprecision::cpp_int的数字计数的有效方法是什么? log10()函数显然与multiprecision整数不兼容,我无法找出其他任何方法。

2 个答案:

答案 0 :(得分:2)

您可以使用.str().size()

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

它看起来很浪费,但比log10或除以10更快。

答案 1 :(得分:0)

如果不希望转换为cpp_dec_float 1 (我猜不到)你可以除以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除数开始,例如直到值变得小于该除数)。我让我的探查器指导这样的优化(因为它很容易得到错误的结果)。


1 C++ Boost multiprecision cpp_int