20

如何检测整数的长度?如果我有 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;

但必须有一种更简单或更干净的方法......

4

8 回答 8

38

怎么划分:

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

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

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

于 2012-06-22T07:03:28.583 回答
10

做一个功能:

int count_numbers ( int num) {
   int count =0;
   while (num !=0) {   
      count++;  
      num/=10;
   } 
   return count;
}
于 2012-06-22T07:05:28.347 回答
9

似乎没有人提到将其转换为字符串,然后获取长度。不是性能最高的,但它绝对是在一行代码中完成的:)

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

cout << "LENGTH of " << num << " is " << len << endl;    
// prints "LENGTH of 123456 is 6"
于 2017-02-06T08:56:51.603 回答
5

您可以使用stringstream它,如下所示

stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;
于 2012-06-22T07:20:33.083 回答
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 ?
于 2012-06-22T07:18:28.840 回答
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 不是标准函数,即使许多编译器都支持它。

于 2012-06-22T07:21:41.683 回答
1

len=1+floor(log10(n));//c++代码库(cmath)

于 2017-02-26T10:12:35.503 回答
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是否小于10以避免不必要的除法、增量和 cmp 指令可能更便宜。

但是在优化这个主题上,您可以简单地测试u与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 只支持非常有限的数字,64bit32bit16bit8bit,你可以简单地在生成例程时将自己限制在最大值以使所有大小受益。

要考虑负数,如果u < 0在计算位数之前,您只需将u取反即可。 当然首先使例程支持带符号的数字。

如果您知道u < 1000,那么只编写而不是编写例程可能更容易。

   if (u > 99) len = 3;
   else
   if (u > 9)  len = 2;
   else        len = 1;
于 2015-04-23T03:04:57.273 回答