我喜欢 Ira Baxter 的回答。下面是一个处理各种大小和最大整数值的模板变量(更新为提升循环的上限签出) :
#include <boost/integer_traits.hpp>
template<typename T> T max_decimal()
{
T t = 1;
for (unsigned i = boost::integer_traits<T>::digits10; i; --i)
t *= 10;
return t;
}
template<typename T>
unsigned digits(T v)
{
if (v < 0) v = -v;
if (max_decimal<T>() <= v)
return boost::integer_traits<T>::digits10 + 1;
unsigned digits = 1;
T boundary = 10;
while (boundary <= v) {
boundary *= 10;
++digits;
}
return digits;
}
为了从循环外提升额外的测试实际上获得更好的性能,您需要专门化 max _ decal ()来返回平台上每种类型的常量。一个足够神奇的编译器可以优化对一个常量 max _ decal ()的调用,但是当今大多数编译器的专门化更好。实际上,这个版本可能更慢,因为 max _ decal 的成本比从循环中删除的测试要高。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double num;
int result;
cout<<"Enter a number to find the number of digits, not including decimal places: ";
cin>>num;
result = ((num<=1)? 1 : log10(num)+1);
cout<<"Number of digits "<<result<<endl;
return 0;
}
long long num = 123456789;
int digit = 1;
int result = 1;
while (result != 0)
{
result = num / 10;
if (result != 0)
{
++digit;
}
num = result;
}
cout << "Your number has " << digit << "digits" << endl;