我知道计算int数字的常用方法是使用循环,并继续除以10直到它消失。我很好奇,我可以先将int转换为字符串,然后计算字符串的长度以获得位数(假设只有正数)?
如果这种方法可行,那么使用循环有什么区别?
答案 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();
}