在C++中获取int的十进制表示长度的最佳方法是什么?

jje*_*rms 4 c++

什么是最好的写作方式

int NumDigits(int n);
Run Code Online (Sandbox Code Playgroud)

在C++中,它将返回输入的十进制表示中的位数.例如11-> 2,999-> 3,-1-> 2等.

Tho*_*mas 17

干净快速,独立于sizeof(int):

int NumDigits(int n) {
    int digits = 0;
    if (n <= 0) {
        n = -n;
        ++digits;
    }
    while (n) {
        n /= 10;
        ++digits;
    }
    return digits;
}
Run Code Online (Sandbox Code Playgroud)


vav*_*ava 12

//Works for positive integers only
int DecimalLength(int n) {
    return floor(log10f(n) + 1);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常不确定.如果整数算术应该足够的话,我永远不会达到浮点运算. (9认同)

Art*_*ius 10

最快的方法可能是二元搜索......

//assuming n is positive
if (n < 10000)
    if (n < 100)
        if (n < 10)
            return 1;
        else
            return 2;
    else
        if (n < 1000)
            return 3;
        else
            return 4;
 else
     //etc up to 1000000000
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无论输入如何,它都是3次比较,我怀疑它比分割循环或使用双精度快得多.


Nav*_*een 8

一种方法是(可能不是最有效)将其转换为字符串并找到字符串的长度.喜欢:

int getDigits(int n)
{
    std::ostringstream stream;
    stream<<n;

    return stream.str().length();
}
Run Code Online (Sandbox Code Playgroud)

  • 除非你需要在紧密的循环中计算很多这些解决方案,否则这个解决方案不仅很好,而且它是唯一一个在第一次尝试时没有错误的解决方案.关于这一点有一些话要说. (3认同)
  • @jleedev:......慢慢来 (2认同)

jon*_*son 7

要扩展Arteluis的答案,您可以使用模板生成比较:

template<int BASE, int EXP>
struct Power
{
    enum {RESULT = BASE * Power<BASE, EXP - 1>::RESULT};
};

template<int BASE>
struct Power<BASE, 0>
{
    enum {RESULT = 1};
};

template<int LOW = 0, int HIGH = 8>
struct NumDigits
{
    enum {MID = (LOW + HIGH + 1) / 2};

    inline static int calculate (int i)
    {
        if (i < Power<10, MID>::RESULT)
            return NumDigits<LOW, MID - 1>::calculate (i);
        else
            return NumDigits<MID, HIGH>::calculate (i);
    }
};

template<int LOW>
struct NumDigits<LOW, LOW>
{
    inline static int calculate (int i)
    {
        return LOW + 1;
    }
};

int main (int argc, char* argv[])
{
    // Example call.
    std::cout << NumDigits<>::calculate (1234567) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Dip*_*ick 6

numdigits = snprintf(NULL, 0, "%d", num);
Run Code Online (Sandbox Code Playgroud)