如何在没有字符串强制转换的情况下计算整数中的数字?

Met*_*ile 33 zero-pad

我担心这个问题有一个简单明了的答案.我需要确定项目数量的宽度是多少,这样我就可以使用维持对齐所需的最小前导零数来填充每个项目编号.例如,如果总数<10则不想要前导零,如果它在10到99之间,则不需要1,等等.

一种解决方案是将项目计数转换为字符串,然后计算字符数.呸!有没有更好的办法?

编辑:我不会想到使用常见的对数(我不知道存在这样的事情).所以,对我来说并不明显 - 但绝对简单.

Nic*_*uso 51

这应该这样做:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
Run Code Online (Sandbox Code Playgroud)

  • 所以也许只是简单地调用n.toString().length()或n.abs().toString().length()毕竟不是一个坏主意.当然,没有数学背景的人会更容易理解. (3认同)

Rya*_*rle 12

int length = (int)Math.Log10(Math.Abs(number)) + 1;
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑负号..


jhe*_*iko 12

如果带有乘法的语句,则会重复比重复除法更有效的解决方案...例如(其中n是需要数字位数的数字)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}
Run Code Online (Sandbox Code Playgroud)

如果项目计数有一些合理的上限(例如无符号整数的32位范围),那么更好的方法是与某些静态数组的成员进行比较,例如

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

您可以使用 while 循环,它可能比对数更快,因为它仅使用整数算术:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}
Run Code Online (Sandbox Code Playgroud)

我将其作为练习留给读者调整该算法以处理零和负数。