我怎样才能计算一个整数的数字没有string转换?
我担心这个问题有一个简单而明显的答案。 我需要确定多less个数字的项目数,以便我可以填充每个项目编号与维持alignment所需的前导零的最小数量。 例如,如果总数<10,则不需要前导零,如果在10和99之间,则为1。
一种解决方法是将项目数转换为string,然后对字符进行计数。 呸! 有没有更好的办法?
编辑:我不会想用常用的对数 (我不知道这样的事情存在)。 所以,对我来说并不明显 – 但绝对简单。
这应该做到这一点:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
int length = (int)Math.Log10(Math.Abs(number)) + 1;
您可能需要考虑负号
如果语句乘以…例如(其中n是需要位数的数字),则将重复比重复划分更有效的解决scheme,
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;
如果你打算用.Net填充数字,那么
num.ToString().PadLeft(10, '0')
可能做你想做的事情。
您可以使用while循环,这可能会比对数更快,因为它只使用整数运算:
int len = 0; while (n > 0) { len++; n /= 10; }
我把它作为练习,让读者调整这个algorithm来处理零和负数。
我会发表评论,但我的代表分数不会给予我这种区别。
所有我想指出的是,即使Log(10)是一个非常优雅的(阅读:几行代码)解决scheme,但它可能是处理器上最重要的一个。
我认为jherico的答案可能是最有效的解决scheme,因此应该得到奖励。
特别是如果你要这么做很多数字
由于一个数字没有前导零,所以你要转换来添加它们。 我不知道为什么你要尽力避免find最终结果必须是string的长度。
一个解决scheme是由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 $