我怕有一个浅显的回答这个问题。我需要确定项目的数量多少位数是广泛的,让我可以垫与每个项目数的最小的保持对准所需的前导零的数目。例如,我想没有前导零如果总是<10,1,如果它是10和99之间,等等。

一个解决方案是铸项目计数字符串,然后计数的字符。呸!有没有更好的办法?

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

有帮助吗?

解决方案

此应该这样做:

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

其他提示

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

您可能需要考虑负号..

比重复分裂一种更有效的解决方案将被重复如果与乘法...例如语句(其中n是数字,其数量是必需的数量)

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

如果有一些合理的上限项目计数(例如一个unsigned int的32位范围),则甚至更好的方式是用一些静态数组,e.g的成员进行比较。

// 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;

如果你要垫的数量在.NET中,然后

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

可以做你想做的。

可以使用while循环,这可能会比一对数速度更快,因为这使用整数运算只:

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

我把它作为一个练习读者调整此算法来处理零个负号。

我会发布的评论,但我代表的分数将不授予我这样的区分。

所有我想指出的是,即使该日志(10)是一个非常优雅(读:代码非常几行)溶液,它可能是在处理器上的一个最费力的

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

特别是如果你打算做这一个批号的..

由于许多没有前导零,你将反正添加它们。我不知道你为什么如此努力,以避免它找到的长度时,最终的结果将是一个字符串反正。

的一种解决方案是通过基座10的对数设置,有点矫枉过正。

可以循环并通过10删除,计数的次数你回路;

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

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

#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 $ 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top