一种明显的解决方案是:
int n = 2134; while(n > 9) n /= 10;
这需要线性时间。我们可以做得更快吗?
这比线性时间快吗?
char s[100]; sprintf(s, "%d", n); n = s[0]-'0';
还有哪些其他方式(效率是最主要的问题)? 我已经看过了,除了只需要查找第一个数字。(而且,我不明白答案)。
一些处理器具有非常快速地计算数字“多少”的指令(请参阅http://en.wikipedia.org/wiki/Leading_zero_count)。这可用于快速选择10的幂并除以,而不是反复除以10。
假设您有一个函数clz,可以计算数字的二进制表示形式(0 … 32)中前导零位的数量。然后,您可以使用一个查找表,该表对于每个前导零个数给出10的适当幂。
clz
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; }