当前位置: 首页 > 知识库问答 >
问题:

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

熊嘉茂
2023-03-14

一个显而易见的解决方案是:

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

这需要线性时间。我们能再快点吗?

这比线性时间快吗

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

还有哪些方法(效率是首要考虑的)<我见过这个,只是我只需要找到第一个数字。(还有,我不明白答案)。

共有3个答案

尚恩
2023-03-14

我很确定sprintf(我认为是这样)会明显变慢。您可以进行一些优化以减少除法运算的数量(这是几乎所有处理器上最慢的指令之一)。

所以我们可以做这样的事情:

 while(n > 10000)
   n /= 1000;

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

当然,如果速度真的很重要的话。

唐修明
2023-03-14

例如,对于32位无符号:

步骤1:确定(通过二进制搜索)该值在以下哪个时间间隔内:

0 .. 9
10 .. 99
100 .. 999
1000 .. 9999
10000 .. 99999
100000 .. 999999
1000000 .. 9999999
10000000 .. 99999999
100000000 .. 999999999
1000000000 .. 4294967295

最多4次比较

第二步:

比计算前导数字除以一。

曾飞雨
2023-03-14

一些处理器的指令可以快速计算一个数字的“大小”(参见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;
}
 类似资料:
  • 根据维基百科,二进制32格式具有6到9个有效十进制数字精度,64格式具有15到17个有效十进制数字精度。 我发现这些有效的十进制数字是用尾数计算出来的,但是我没有得到它,怎么计算呢?知道吗? 32位格式的曼蒂萨=24位,64位格式的曼蒂萨=53位

  • 问题内容: 我只是在学习Java,并且正在尝试让我的程序检索数字的第一个数字- 例如543应该返回5,依此类推。我想转换为字符串,但是我不确定如何将其转换回字符串?谢谢你的帮助。 问题答案: int number = 534; int firstDigit = Integer.parseInt(Integer.toString(number).substring(0, 1));

  • 我已经在网上搜索了,我发现所有的都是使用DecimalFormat并尝试了它,但当我在Android Studio上编码时,出现了一条消息,说必须使用API24来执行这种命令。API24有错误和所有的网站,我看,建议使用API23。 因此,我需要一种方法来显示双数字,只有两个十进制数字在我的AlertDialog。

  • 我正在使用DecimalFormats将双打格式化为字符串。然后这个字符串被集成到我的表示层中。 问题:我想保留所有的小数。示例:“12345678.123456789” 格式:#.#- 我可以用##########对于大小数点,但是如果小数点更长呢? 我发现我的小测试程序很有用,想和大家分享。 你能帮我显示所有小数吗? 这导致: 编辑:一位用户提到了一个相关的问题:如何很好地将浮点数格式化为字符

  • 我有一个二进制数,表示为11.1111111(与小数点类似)。点前有2位,点后有1024位。这是一个将e计算到高精度的练习,但现在我被困在如何将其转换为十进制的问题上。万一你们想知道号码,就在这里: 如何将其转换为2.718。。。。(小数点后应该有309位左右)我不能简单地将每一位乘以2^x,因为一段时间后,数字2^x将=0,即使使用双精度浮点。我使用的是Visual Basic,所以我不确定是否

  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案: