我想知道如何在C中找到整数的长度。
例如:
>F29
诸若此类。
我怎么用C语言做这件事?
发布于 2010-06-18 09:13:47
C:
为什么不直接取这个数字的绝对值的基数这适用于不是0的正负数,并避免使用任何字符串转换函数。
log10、abs和floor函数由math.h提供。例如:
int nDigits = floor(log10(abs(the_integer))) + 1;您应该在一个确保the_integer != 0的子句中包装这一点,因为log10(0)根据man 3 log返回-HUGE_VAL。
此外,如果输入为负数,如果您对数字的长度(包括负号)感兴趣,则可能需要在最终结果中添加一个。
爪哇:
int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;N.B.这种计算方法所涉及的浮点性质可能会导致它比一种更直接的方法慢。关于效率的一些讨论,见康肯的回答。
发布于 2010-06-18 12:33:39
如果您对一个快速且非常简单的解决方案感兴趣,下面的方法可能是最快的(这取决于所讨论的数字的概率分布):
int lenHelper(unsigned x) {
if (x >= 1000000000) return 10;
if (x >= 100000000) return 9;
if (x >= 10000000) return 8;
if (x >= 1000000) return 7;
if (x >= 100000) return 6;
if (x >= 10000) return 5;
if (x >= 1000) return 4;
if (x >= 100) return 3;
if (x >= 10) return 2;
return 1;
}
int printLen(int x) {
return x < 0 ? lenHelper(-x) + 1 : lenHelper(x);
}虽然它可能不会因为最巧妙的解决方案而获奖,但是理解它是微不足道的,执行起来也是微不足道的--所以它是快速的。
在使用MSC的Q6600上,我使用以下循环对此进行了基准测试:
int res = 0;
for(int i = -2000000000; i < 2000000000; i += 200) res += printLen(i);这个解决方案需要0.062秒,皮特·柯克姆采用智能对数方法的第二快解决方案需要0.115秒--几乎是其长度的两倍。然而,对于10000及以下的数字,智能日志更快。
以牺牲一些清晰度为代价,您可以更可靠地击败智能日志(至少在Q6600上):
int lenHelper(unsigned x) {
// this is either a fun exercise in optimization
// or it's extremely premature optimization.
if(x >= 100000) {
if(x >= 10000000) {
if(x >= 1000000000) return 10;
if(x >= 100000000) return 9;
return 8;
}
if(x >= 1000000) return 7;
return 6;
} else {
if(x >= 1000) {
if(x >= 10000) return 5;
return 4;
} else {
if(x >= 100) return 3;
if(x >= 10) return 2;
return 1;
}
}
}这个解决方案在大量数据上仍然是0.062秒,对于较小的数字则下降到0.09 s左右--在这两种情况下都比智能日志方法更快。(gcc编写了更快的代码;0.052用于此解决方案,0.09 s用于智能日志方法)。
发布于 2010-06-18 09:11:44
int get_int_len (int value){
int l=1;
while(value>9){ l++; value/=10; }
return l;
}第二种方法也适用于负数:
int get_int_len_with_negative_too (int value){
int l=!value;
while(value){ l++; value/=10; }
return l;
}https://stackoverflow.com/questions/3068397
复制相似问题