2

获取 a 的位数的有效方法是boost::multiprecision::cpp_int什么?该log10()函数显然与多精度整数不兼容,我想不出任何其他方法来做到这一点。

4

2 回答 2

2

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

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

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

于 2015-03-25T04:48:32.923 回答
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 多精度 cpp_int

于 2015-02-08T18:18:01.640 回答