小编典典

如何有效检索数字的第一个十进制数字

algorithm

一种明显的解决方案是:

int n = 2134;
while(n > 9)
    n /= 10;

这需要线性时间。我们可以做得更快吗?

这比线性时间快吗?

char s[100];
sprintf(s, "%d", n);
n = s[0]-'0';

还有哪些其他方式(效率是最主要的问题)?
我已经看过,除了只需要查找第一个数字。(而且,我不明白答案)。


阅读 258

收藏
2020-07-28

共1个答案

小编典典

一些处理器具有非常快速地计算数字“多少”的指令(请参阅http://en.wikipedia.org/wiki/Leading_zero_count)。这可用于快速选择10的幂并除以,而不是反复除以10。

假设您有一个函数clz,可以计算数字的二进制表示形式(0 …
32)中前导零位的数量。然后,您可以使用一个查找表,该表对于每个前导零个数给出10的适当幂。

uint32_t powers_of_10[33] = {
    1000000000, 1000000000,
    100000000, 100000000, 100000000,
    10000000, 10000000, 10000000,
    1000000, 1000000, 1000000, 1000000,
    100000, 100000, 100000,
    10000, 10000, 10000,
    1000, 1000, 1000, 1000,
    100, 100, 100,
    10, 10, 10,
    1, 1, 1, 1, 1
};

int CalcFirstDecimalDigit(uint32_t x)
{
    int leading_zeros = clz(x);
    x /= powers_of_10[leading_zeros];
    if (x >= 10)
        return 1;
    else
        return x;
}
2020-07-28