获取int中的位数

时间:2012-06-22 07:01:56

标签: c++ c

如何检测整数的长度?如果我有le:int test(234567545);

我怎么知道int有多长?比如告诉我里面有9个数字???

我尝试过:

char buffer_length[100];


    //  assign directly to a string.

    sprintf(buffer_length, "%d\n", 234567545);

    string sf = buffer_length;


    cout <<sf.length()-1 << endl;

但是大部分都是更简单的方式或者更干净......

8 个答案:

答案 0 :(得分:35)

分裂怎么样:

int length = 1;
int x = 234567545;
while ( x /= 10 )
   length++;

或使用<math.h>中的log10方法。

注意 log10会返回double,因此您必须调整结果。

答案 1 :(得分:11)

创建一个功能:

int count_numbers ( int num) {
   int count =0;
   while (num !=0) {   
      count++;  
      num/=10;
   } 
   return count;
}

答案 2 :(得分:6)

似乎没有人提到将它转换为字符串,然后获得长度。我不确定这是多么高效,但它确实在一行代码中完成:)

int num = 123456;
int len = to_string(num).length();

cout << "LENGTH of " << num << " is " << len << endl;
// prints "LENGTH of 123456 is 6"

答案 3 :(得分:4)

如果“i”是整数,那么

int len ;

char buf[33] ;

itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ?

len = strlen(buf) ;

if(i < 0)
    len-- ;    // maybe if you don't want to include "-" in length ?

答案 4 :(得分:4)

您可以使用stringstream进行此操作,如下所示

stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;

答案 5 :(得分:4)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

    int i=2384995;
    char buf[100];

    itoa(i, buf, 10); // 10 is the base decimal

    printf("Lenght: %d\n", strlen(buf));


    return 0;
}

请注意itoa不是标准函数,即使它受到许多编译器的支持。

答案 6 :(得分:0)

通过互联网查看,将计数器变量初始化为0,然后只要计数不等于0就进入预条件循环测试是很常见的。一个do-while循环是完美避免这种情况。

    unsigned udc(unsigned u) //unsigned digit count
    {
      unsigned c = 0;
      do
        ++c;
      while ((u /= 10) != 0);
      return c;
    }

测试 u 是否小于 10 可能更便宜,以避免在 u的情况下出现不必要的除法,增量和cmp指令&lt;的 10

但在这个主题上,优化时,你可以简单地测试对抗的恒定功率。

    unsigned udc(unsigned u) //unsigned digit count
    {
      if (u < 10)   return 1;
      if (u < 100)  return 2;
      if (u < 1000) return 3;
      //...
      return 0; //number was not supported
    }

可以为每个数字节省 3 指令,但不太适合不同的基数,除了不那么有吸引力,而且手工编写也很乏味,在这种情况下你宁愿写一个在将例程插入程序之前编写例程的例行程序。因为C只支持非常有限的数字, 64位 32位 16位 8位,您可以简单地限制自己生成常规以使所有尺寸受益的最大值。

如果&lt;

为负数而烦恼,你只需否定 在计算位数之前 0 。当然首先要提供常规支持签名号码。

如果你知道&lt; <强> 1000 下, 它可能更容易编写,而不是编写例程。

   if (u > 99) len = 3;
   else
   if (u > 9)  len = 2;
   else        len = 1;

答案 7 :(得分:-1)

len = 1 + floor(log10(n)); // c ++ code lib(cmath)