【问题标题】:Get the number of digits in an int获取 int 中的位数
【发布时间】:2012-06-24 11:28:23
【问题描述】:

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

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

【问题讨论】:

  • 一个想法:负数应该如何处理?
  • 这里为什么需要std::string?你可以做一个strlen(buffer_length)。您也不需要\n,因此不需要-1
  • C 和 C++ 是不同的编程语言。一个数字没有数字,只有它的十进制表示有数字。

标签: c++ c


【解决方案1】:

除法怎么样:

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

或使用&lt;math.h&gt; 中的log10 方法。

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

【讨论】:

  • 谢谢! :) 正是我需要知道的
  • 注意,log(0) 是 –infinity,将其转换为整数是 UB。
【解决方案2】:

创建一个函数:

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

【讨论】:

  • 我认为我们可以在 while 之前添加一个简单的 if
  • 你的功能有效,但是.. ..有点晚了.. 无论如何,这不会阻止我给你+1!
  • 如果num==0 那么它应该返回1,因为它有一个数字。
【解决方案3】:

如果“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 ?

【讨论】:

  • buf[12] 应该足够了(最多 10 位数字 + 符号 + '\0')。
【解决方案4】:

您可以使用stringstream,如下所示

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

【讨论】:

    【解决方案5】:
    #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 不是标准函数,即使许多编译器都支持它。

    【讨论】:

    • buf[12] 应该足够了(最多 10 位数字 + 符号 + '\0')。
    【解决方案6】:

    纵观互联网,通常会犯错误将计数器变量初始化为 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 指令10。

    但是在优化这个主题时,您可以简单地测试 u10 的恒定幂。

        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 只支持非常有限的数字,64bit,32bit,16bit,8bit,你可以简单地限制自己生成例程以使所有规模受益时的最大值。

    要考虑负数,您只需 negate u if u 0 然后再计算位数。当然首先要让例程支持签名数字。

    如果您知道 u 1000, 只写可能比编写例程更容易。

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

    【讨论】:

      【解决方案7】:

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

      int num = -123456;
      int len = to_string(abs(num)).length();
      
      cout << "LENGTH of " << num << " is " << len << endl;    
      // prints "LENGTH of 123456 is 6"
      

      【讨论】:

      • 只检查负值;)
      • @Blood-HaZaRd - 大声笑..你/说得对......让int len = to_string(abs(num)).length();
      【解决方案8】:

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

      【讨论】:

      • 为什么不爱可怜的号码0
      猜你喜欢
      • 2010-11-21
      • 2019-06-05
      • 1970-01-01
      • 2019-03-30
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多