什么是最好的写作方式
int NumDigits(int n);
Run Code Online (Sandbox Code Playgroud)
在C++中,它将返回输入的十进制表示中的位数.例如11-> 2,999-> 3,-1-> 2等.
Tho*_*mas 17
干净快速,独立于sizeof(int):
int NumDigits(int n) {
int digits = 0;
if (n <= 0) {
n = -n;
++digits;
}
while (n) {
n /= 10;
++digits;
}
return digits;
}
Run Code Online (Sandbox Code Playgroud)
vav*_*ava 12
//Works for positive integers only
int DecimalLength(int n) {
return floor(log10f(n) + 1);
}
Run Code Online (Sandbox Code Playgroud)
Art*_*ius 10
最快的方法可能是二元搜索......
//assuming n is positive
if (n < 10000)
if (n < 100)
if (n < 10)
return 1;
else
return 2;
else
if (n < 1000)
return 3;
else
return 4;
else
//etc up to 1000000000
Run Code Online (Sandbox Code Playgroud)
在这种情况下,无论输入如何,它都是3次比较,我怀疑它比分割循环或使用双精度快得多.
一种方法是(可能不是最有效)将其转换为字符串并找到字符串的长度.喜欢:
int getDigits(int n)
{
std::ostringstream stream;
stream<<n;
return stream.str().length();
}
Run Code Online (Sandbox Code Playgroud)
要扩展Arteluis的答案,您可以使用模板生成比较:
template<int BASE, int EXP>
struct Power
{
enum {RESULT = BASE * Power<BASE, EXP - 1>::RESULT};
};
template<int BASE>
struct Power<BASE, 0>
{
enum {RESULT = 1};
};
template<int LOW = 0, int HIGH = 8>
struct NumDigits
{
enum {MID = (LOW + HIGH + 1) / 2};
inline static int calculate (int i)
{
if (i < Power<10, MID>::RESULT)
return NumDigits<LOW, MID - 1>::calculate (i);
else
return NumDigits<MID, HIGH>::calculate (i);
}
};
template<int LOW>
struct NumDigits<LOW, LOW>
{
inline static int calculate (int i)
{
return LOW + 1;
}
};
int main (int argc, char* argv[])
{
// Example call.
std::cout << NumDigits<>::calculate (1234567) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |