获得boost::multiprecision::cpp_int
的数字计数的有效方法是什么? log10()
函数显然与multiprecision整数不兼容,我无法找出其他任何方法。
答案 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除数开始,例如直到值变得小于该除数)。我让我的探查器指导这样的优化(因为它很容易得到错误的结果)。