首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中求整数的长度

问在C中求整数的长度
EN

Stack Overflow用户
提问于 2010-06-18 09:08:49
回答 29查看 284K关注 0票数 86

我想知道如何在C中找到整数的长度。

例如:

  • 1 => 1
  • 25 => 2
  • 12512 => 5
  • 0 => 1

>F29

诸若此类。

我怎么用C语言做这件事?

EN

回答 29

Stack Overflow用户

回答已采纳

发布于 2010-06-18 09:13:47

C:

为什么不直接取这个数字的绝对值的基数这适用于不是0的正负数,并避免使用任何字符串转换函数。

log10、abs和floor函数由math.h提供。例如:

代码语言:javascript
复制
int nDigits = floor(log10(abs(the_integer))) + 1;

您应该在一个确保the_integer != 0的子句中包装这一点,因为log10(0)根据man 3 log返回-HUGE_VAL。

此外,如果输入为负数,如果您对数字的长度(包括负号)感兴趣,则可能需要在最终结果中添加一个。

爪哇:

代码语言:javascript
复制
int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;

N.B.这种计算方法所涉及的浮点性质可能会导致它比一种更直接的方法慢。关于效率的一些讨论,见康肯的回答。

票数 126
EN

Stack Overflow用户

发布于 2010-06-18 12:33:39

如果您对一个快速且非常简单的解决方案感兴趣,下面的方法可能是最快的(这取决于所讨论的数字的概率分布):

代码语言:javascript
复制
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上,我使用以下循环对此进行了基准测试:

代码语言:javascript
复制
int res = 0;
for(int i = -2000000000; i < 2000000000; i += 200) res += printLen(i);

这个解决方案需要0.062秒,皮特·柯克姆采用智能对数方法的第二快解决方案需要0.115秒--几乎是其长度的两倍。然而,对于10000及以下的数字,智能日志更快。

以牺牲一些清晰度为代价,您可以更可靠地击败智能日志(至少在Q6600上):

代码语言:javascript
复制
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用于智能日志方法)。

票数 60
EN

Stack Overflow用户

发布于 2010-06-18 09:11:44

代码语言:javascript
复制
int get_int_len (int value){
  int l=1;
  while(value>9){ l++; value/=10; }
  return l;
}

第二种方法也适用于负数:

代码语言:javascript
复制
int get_int_len_with_negative_too (int value){
  int l=!value;
  while(value){ l++; value/=10; }
  return l;
}
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3068397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档