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

时间:2009-02-16 20:55:37

标签: zero-pad

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

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

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

10 个答案:

答案 0 :(得分:51)

这应该这样做:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

答案 1 :(得分:12)

int length = (int)Math.Log10(Math.Abs(number)) + 1;

您可能需要考虑负号..

答案 2 :(得分:12)

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

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

如果项目计数有一些合理的上限(例如无符号整数的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;

答案 3 :(得分:4)

你可以使用while循环,它可能比对数更快,因为它只使用整数运算:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

我把它作为练习让读者调整这个算法来处理零和负数。

答案 4 :(得分:4)

如果您打算填写.Net中的号码,那么

num.ToString().PadLeft(10, '0') 

可能会做你想要的。

答案 5 :(得分:2)

我会发表评论,但我的代表评分不会给予我这种区别。

我想要指出的是,即使Log(10)是一个非常优雅的(读取:极少数代码行)解决方案,它可能是处理器上最费力的一个。

我认为jherico的回答可能是最有效的解决方案,因此应该得到回报。

特别是如果你打算为很多数字这样做..

答案 6 :(得分:1)

由于数字没有前导零,因此无论如何都要进行转换以添加它们。我不知道为什么你要努力避免它找到最终结果必须是字符串的长度。

答案 7 :(得分:0)

一个解决方案由基数10对数提供,有点矫枉过正。

答案 8 :(得分:0)

你可以循环并删除10,计算你循环的次数;

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

答案 9 :(得分:0)

好的,我无法抗拒:使用/=

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $