遇到一些代码,其中数字的数量是通过将数字转换为字符串然后使用len()来确定的。
Function numOfDigits_len(n As Long) As Long
numOfDigits_len = Len(Str(n)) - 1
End Function现在,尽管这种方法可以工作,但我知道与任何不使用字符串的方法相比,它会很慢,所以我编写了一个使用log()的方法。
Function numOfDigits_log(n As Long) As Long
numOfDigits_log = Int(Log(n) / Log(10)) + 1
End Function将运行时间减少了1/2,这很棒,但在特定情况下发生了一些奇怪的事情。
n numOfDigits_log(n)
===== ====================
999 3
1000 3
1001 4它将无法正确处理1000。我认为这是因为浮点数和舍入问题。
Function numOfDigits_loop(ByVal n As Long) As Long
Do Until n = 0
n = n \ 10
numOfDigits_loop = numOfDigits_loop + 1
Loop
End Function写了这篇文章,当数字大于10^6时,速度慢了约10%,而且随着n变大,似乎变得慢慢变大了。如果我是务实的,这是可以的,但我想找到更理想的东西。
现在我的问题是,是否有一种方法可以准确地使用log()方法。我可以做类似这样的事情
Function numOfDigits_log(n As Long) As Long
numOfDigits_log = Int(Log(n) / Log(10) + 0.000000001) + 1
End Function但它看起来很“老土”。有没有比log()方法更快或更快的更好的方法?注意:我意识到这种优化在很多情况下是没有意义的,但现在我遇到了这个问题,我想“修复”它
发布于 2013-06-20 04:56:17
我以前回答过这个问题,但我找不到它,所以这里是基本的:
int i = ... some number >= 0 ...
int n = 1;
if (i >= 100000000){i /= 100000000; n += 8;}
if (i >= 10000){i /= 10000; n += 4;}
if (i >= 100){i /= 100; n += 2;}
if (i >= 10){i /= 10; n += 1;}这是用C语言写的,但是你能理解其中的意思。
发布于 2013-06-20 04:30:19
while循环保证正确性,即它不使用任何浮点计算
int numDigits = 0;
while(num != 0) {
num /= 10;
numDigits++;
}你也可以通过使用更大的除数来提高速度。
int numDigits = 0;
if(num >= 100000 || num <= -100000) {
int prevNum;
while(num != 0) {
prevNum = num;
num /= 100000;
numDigits += 5;
}
num = prevNum;
numDigits -= 5;
}
while(num != 0) {
num /= 10;
numDigits++;
}发布于 2013-06-20 04:25:45
你会喜欢这个的。
我们生活在一个以10为基数的数字系统中!这意味着你所要做的就是四舍五入。
某些数字的长度总是= ceiling (log n)。例如: 7456412 (一个7位数字)。Log (7456412) = 6.8...round up,你有7.log(7456412)= 3.9999。四舍五入是4。
特殊情况是当你不需要舍入,或者当你有一些10的幂的时候。例如: log(1000) = 3。如果你可以检测到你有10的幂,在log结果上加1,你就赢了!
您可以进行此检测的方法类似于
double log10;
int clog10;
int length;
log10 = (Log(n) / Log(10)); // can also use a private static final long hardcoded for Log(10)
clog10 = ceiling(log10);
if (Int(log10) == clog10)
length = clog10 + 1;
else
length = clog10;https://stackoverflow.com/questions/17200539
复制相似问题