我想知道c ++中数字的位数,但我不知道我该怎么办?例如,位数7676575。
答案 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()