3

我想找出 C++ 中数字的位数,但我不知道该怎么办?例如位数 7676575。

4

5 回答 5

11

取以 10 为底的对数的上限。(或更一般地,“ base- N ”表示以N为底的位数。)

在代码中:std::ceil(std::log10(n + 1)),并确保#include <cmath>.

0(作为特殊情况,您将得到输入的答案0。如何处理负数取决于您。)

@Knaģis 的答案中的代码可能更有效,因为除以常数 10 可以被编译器转换为乘法并且相当便宜。您必须分析和比较这是否对性能至关重要,以及这是否仅适用于整数类型。对数方法还允许您计算非常大的浮点数的假设十进制扩展中的位数。

于 2012-11-12T18:03:53.017 回答
7
int i = 7676575;
int digits = i == 0 ? 1 : 0;
i = abs(i); // handle negative numbers as well
while (i > 0)
{
    digits++;
    i /= 10;
}

// -or- if you prefer do/while then a shorter sample (by Kerrek SB)

int i = 7676575;
int digits = 0;
i = abs(i); // handle negative numbers as well
do { digits++; } while (i /= 10);
于 2012-11-12T18:04:21.407 回答
0

把它放在一个字符串中并得到它的长度;

int number = getNumberFromSomewhere();

stringstream ss;

ss << number;
size_t numDigits = ss.str().length();
于 2012-11-12T18:08:15.373 回答
0
template <typename T>
int getdigits(T v)
{
T i = std::abs(v);
if (i < 10) return 1;
else if (i < 100) return 2;
...
else if (i < 100000000) return 8;
else if (i < 1000000000) return 9;
}

依此类推,您可以扩展到包括长范围,而不仅仅是 int。我不确定这是否比除法更快,但为什么不 - 这只是 10 次比较。

我想模板黑魔法可以用来生成只需要几个 if 的函数,但谁真的在乎呢。但是您可以使用 std::enable_if<std::is_integer<T>::value> 确保 T 是整数。

于 2012-11-12T18:12:06.667 回答
0

您可以转换为字符串并检查字符串的长度:

std::to_string(number).size()
于 2017-02-22T00:15:09.580 回答