如何找出c ++中数字的位数?

时间:2012-11-12 18:02:55

标签: c++

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

5 个答案:

答案 0 :(得分:11)

取数字的基数10对数的上限。 (或者更一般地说,“base- N ”表示基数 N 中的位数。)

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

(作为特殊情况,您将获得输入0的答案0。由您自行决定如何处理负数。)

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

答案 1 :(得分: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);

答案 2 :(得分:0)

将它放在一个字符串中并获得它的长度;

int number = getNumberFromSomewhere();

stringstream ss;

ss << number;
size_t numDigits = ss.str().length();

答案 3 :(得分: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次比较。

我认为黑魔法模板可用于生成仅需要ifs数量的函数,但是谁真正关心。但是你可以使用std :: enable_if&lt; std :: is_integer&lt; T&gt; :: value&gt;确保T是整数。

答案 4 :(得分:0)

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

std::to_string(number).size()