【问题标题】:C++ - how to find the length of an integerC ++ - 如何找到整数的长度
【发布时间】:2014-05-04 03:29:56
【问题描述】:

我正在尝试找到一种方法来查找整数的长度(位数),然后将其放入整数数组中。该作业还要求在不使用 STL 的类的情况下执行此操作,尽管程序规范确实说我们可以使用“通用 C 库”(我会问我的教授是否可以使用 cmath,因为我假设 log10(num) + 1 是最简单的方法,但我想知道是否还有其他方法)。

啊,这不必处理负数。唯一的非负数。

我正在尝试创建一个变体“MyInt”类,它可以使用动态数组处理更广泛的值。任何提示将不胜感激!谢谢!

【问题讨论】:

  • @KerrekSB 实际上我认为他的意思是总的无符号值。那将是 (sizeof(int) * 8 - 1) 的 2 次方,对吗?编辑:没关系。
  • 十进制整数的位数为(log(number) / log(10))。
  • 不要重新发明轮子,使用“大数字”库。在网上搜索“c++ big number library”。
  • int len = n?0:1; while (n) { len++, n/=10 }
  • 谢谢你的提示,Thomas,但这实际上是课堂作业,对新手来说有点编程挑战!

标签: c++ count numbers integer digits


【解决方案1】:

整数n 在任何基数中的位数可以通过除法得到,直到你完成:

unsigned int number_of_digits = 0;

do {
     ++number_of_digits; 
     n /= base;
} while (n);

【讨论】:

  • 没有理由使用此解决方案,因为基于 log10 的解决方案要好得多。
  • @tleb:在什么意义上更好?你比较过这两种方法吗?
  • 这样比log10 解决方案更好,但更喜欢更明确的while (n != 0) 以提高可读性。不过,值得一票。
【解决方案2】:

不一定是最高效的,但使用 C++ 时最短且最易读的一种:

std::to_string(num).length()

【讨论】:

  • @Zammbi 问题的字面意思是“这不必处理负数”。
  • 这个解决方案满足这个要求。它还处理负数。 xD
【解决方案3】:

有一个更好的方法来做到这一点

    #include<cmath>
    ...
    int size = trunc(log10(num)) + 1
....

适用于 int 和 decimal

【讨论】:

  • 我喜欢这个(因此赞成),不幸的是它不适用于数字零......
【解决方案4】:

如果您可以使用 C 库,那么一种方法是使用 sprintf,例如

#include <cstdio>

char s[32];

int len = sprintf(s, "%d", i);

【讨论】:

  • 你可以使用snprintf(nullptr, 0, "%d", i);` 而不需要s
  • 这也不适用于 128 位整数。 @Tony 的 nullptr 解决方案将解决这个问题。
【解决方案5】:

“我的意思是整数的位数,即“123”的长度为3”

int i = 123;

// the "length" of 0 is 1:
int len = 1;

// and for numbers greater than 0:
if (i > 0) {
    // we count how many times it can be divided by 10:
    // (how many times we can cut off the last digit until we end up with 0)
    for (len = 0; i > 0; len++) {
        i = i / 10;
    }
}

// and that's our "length":
std::cout << len;

输出3

【讨论】:

    【解决方案6】:

    最长int 的封闭公式(我在这里使用int,但适用于任何有符号整数类型):

    1 + (int) ceil((8*sizeof(int)-1) * log10(2))
    

    解释:

                      sizeof(int)                 // number bytes in int
                    8*sizeof(int)                 // number of binary digits (bits)
                    8*sizeof(int)-1               // discount one bit for the negatives
                   (8*sizeof(int)-1) * log10(2)   // convert to decimal, because:
                                                  // 1 bit == log10(2) decimal digits
        (int) ceil((8*sizeof(int)-1) * log10(2))  // round up to whole digits
    1 + (int) ceil((8*sizeof(int)-1) * log10(2))  // make room for the minus sign
    

    对于 4 字节的 int 类型,结果为 11。带有 11 个十进制数字的 4 字节 int 的示例是:“-2147483648”。

    如果你想要一些int值的小数位数,你可以使用下面的函数:

    unsigned base10_size(int value)
    {
        if(value == 0) {
            return 1u;
        }
    
        unsigned ret;
        double dval;
        if(value > 0) {
            ret = 0;
            dval = value;
        } else {
            // Make room for the minus sign, and proceed as if positive.
            ret = 1;
            dval = -double(value);
        }
    
        ret += ceil(log10(dval+1.0));
    
        return ret;
    }
    

    我在 g++ 9.3.0 for x86-64 中测试了整个int 范围内的函数。

    【讨论】:

    • ceil(log10(var+1)) INT_MAX 将失败
    • 这个不靠谱,type的最大值会失效。完全同意砖家。正如 Riot 所说,我更喜欢 std::to_string(num).length()。
    • INT_MAX的问题已通过在加1之前转换为double解决。
    【解决方案7】:

    我会做一个计算机书呆子而不是数学书呆子:

    char buffer[64];
    int len = sprintf(buffer, "%d", theNum);
    

    【讨论】:

    • 当 256 位整数可用时会严重崩溃 :-)
    【解决方案8】:
    int intLength(int i) {
        int l=0;
        for(;i;i/=10) l++;
        return l==0 ? 1 : l;
    }
    

    这是一个高效的小工具

    【讨论】:

    • 你必须保存 case i == 0. 这也是 1 并且当前函数返回 0;
    【解决方案9】:

    这是一种有效的方法吗?转换为字符串并找到长度属性?

    int num = 123  
    string strNum = to_string(num); // 123 becomes "123"
    int length = strNum.length(); // length = 3
    char array[3]; // or whatever you want to do with the length
    

    【讨论】:

    • 虽然效率不高。
    【解决方案10】:

    怎么样(也适用于 0 和负数):

    int digits( int x ) { 
        return ( (bool) x * (int) log10( abs( x ) ) + 1 );
    }
    

    【讨论】:

      【解决方案11】:

      最好的方法是使用日志查找,它总是有效的

      int len = ceil(log10(num))+1;
      

      【讨论】:

      • 对于 num==50, log10(50) ~= 1.7, ceil(1.7) = 2 plus 1 得到 3。用 ceil 向上取整是错误的方法。
      • 你应该截断而不是四舍五入
      【解决方案12】:

      查找整数和十进制数长度的代码:

      #include<iostream>
          #include<cmath>
          using namespace std;
          int main()
          {
              int len,num;
              cin >> num;
              len = log10(num) + 1;
              cout << len << endl;
              return 0;
          }
          //sample input output
          /*45566
          5
      
          Process returned 0 (0x0)   execution time : 3.292 s
          Press any key to continue.
          */
      

      【讨论】:

        【解决方案13】:

        在 C/C++ 和 STL 中没有用于查找整数长度的内置函数,但可以找到的方法很少
        这是一个查找整数长度的示例 C++ 代码,它可以写在一个函数中以供重用。

        #include<iostream>
        using namespace std;
        
        int main()
        {
          long long int n;
          cin>>n;
          unsigned long int integer_length = 0;
        
          while(n>0)
          {    
           integer_length++;
           n = n/10; 
          }
         
          cout<<integer_length<<endl;
        
         return 0;
        }
        

        还有一种方法,将整数转换为字符串,求长度,单行即可:

        #include<iostream>
        #include<cstring>
        using namespace std;
        
            int main()
            {
                long long int n;
            cin>>n;
            unsigned long int integer_length = 0;
            
            // convert to string
            integer_length = to_string(n).length();
            
            cout<<integer_length<<endl;
        
            return 0;
            }
        

        注意:一定要包含cstring 头文件

        【讨论】:

          【解决方案14】:

          最简单的方法是:

          #include <string> 
          
          int int_length = to_string(42).length();
          

          【讨论】:

            【解决方案15】:

            在 c++ 中不使用任何库的最简单方法是

            #include <iostream>
            using namespace std;
            
            int main()
            {
                int num, length = 0;
                cin >> num;
                while(num){
                    num /= 10;
                    length++;
                }
                cout << length;
            }
            

            【讨论】:

            • 这并没有真正为其他答案(包括已接受的答案)所提议的内容添加任何新内容。
            【解决方案16】:

            查找数字长度的最有效代码.. 也计算零,注意“n”是要给出的数字。

            #include <iostream>
            using namespace std;
            int main()
            {
                int n,len= 0;
                cin>>n;
            while(n!=0)
                {
                   len++;
                   n=n/10;
                }
                cout<<len<<endl;
                return 0;
            }
            

            【讨论】:

            • 这提供了accepted answer 没有提供的任何东西。
            • 是的。已经有 14 个答案,这与他们中的许多人没有什么不同。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-05
            • 1970-01-01
            相关资源
            最近更新 更多