我可以将int转换为字符串然后计算数字位数吗?

时间:2015-07-22 22:07:19

标签: c++ stdstring

我知道计算int数字的常用方法是使用循环,并继续除以10直到它消失。我很好奇,我可以先将int转换为字符串,然后计算字符串的长度以获得位数(假设只有正数)?

如果这种方法可行,那么使用循环有什么区别?

4 个答案:

答案 0 :(得分:4)

是的,你可以。不,你真的不想这样做。它比使用循环慢2个数量级(~100x)。为什么?因为整数到字符串转换不仅必​​须执行某种循环来生成字符串的数字,而且还必须分配解除分配堆来保存字符串,除非字符串有某种类型的小字符串优化。

在大多数情况下,人们会认为你的方法是一个丑陋的黑客。如果要计算整数中的数字,则甚至不需要循环:

constexpr int digits(int32_t x) {
  return 
    (x < 0 ? digits(-x) :
    (x < 10 ? 1 :   
    (x < 100 ? 2 :   
    (x < 1000 ? 3 :   
    (x < 10000 ? 4 :   
    (x < 100000 ? 5 :   
    (x < 1000000 ? 6 :   
    (x < 10000000 ? 7 :  
    (x < 100000000 ? 8 :  
    (x < 1000000000 ? 9 :  
    10))))))))));  
}

答案 1 :(得分:3)

是的,这种方法是可行的 不同之处在于,如果先转换为字符串,则需要执行额外的步骤。字符串转换实际上与您描述的循环类似。

以下是如何通过字符串长度计算整数位数的示例:

#include <string>

int number_of_digits(int number) {
    // Using C++11
    return std::to_string(number).length();
}

答案 2 :(得分:2)

您可以使用itoa()功能(在下面的示例中,_itoa_s()安全版本的itoa())。此函数基本上将整数转换为字符串(itoa =整数到字母)。

以下是一个例子:

int number;
char temp[12];
cout << "Enter your number: ";
cin >> number;

//itoa(number, temp, 10);
//_itoa_s(number, temp, 12, 10);
_itoa_s(number, temp, 10);

cout << "The number of digits is: " << strlen(temp) << endl;

itoa()有3个参数:您要转换的数字(number),转换后数字将被保留的缓冲区(temp),以及您要转换为(10的数字系统是基数10,又称十进制数字系统。)

_itoa_s()采用第四个参数,即缓冲区的大小。还有一个模板版_itoa_s()专门用于静态数组(在上面的例子中使用)。它需要3个参数,让编译器推导出第4个参数的缓冲区大小。

另外,我为temp缓冲区选择了12个字符,因为整数的最大值是2,147,483,647,有10位数字,加上空终止符的空间和一些额外的对齐。

答案 3 :(得分:0)

对于0的输入,明显的10分频方法将返回0,这可能是您想要的,也可能不是。除此之外,两种方法都会返回相同的方法,但是除以10会更快

如果你像下面的例子中那样使用std :: string(它分配内存),那么除以10的方法很快就会快几百倍。

int numlen_using_divide_by_10(int n) {
  int ret = 0;
  for (; n; n /= 10) ++ret;
  return ret;
}

int numlen_using_string(int n) {
  return std::to_string(n).size();
}