作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
遇到一些代码,其中通过将数字转换为字符串然后使用 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
。我认为这是因为 float 和舍入问题。
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 并且似乎随着 n 变大而变大时,写了这个结果慢了 ~10%。如果我是务实的,那很好,但我想找到更理想的东西。
现在我的问题是,有没有办法准确地使用 log() 方法。我可以做类似的事情
Function numOfDigits_log(n As Long) As Long
numOfDigits_log = Int(Log(n) / Log(10) + 0.000000001) + 1
End Function
但是看起来很“hacky”。有没有比 log() 方法更快或一样快的更好方法? 注意:我意识到这种优化在很多情况下毫无意义,但既然我遇到了这个问题,我想“修复”它
最佳答案
我以前回答过这个问题,但找不到,所以这里是基础知识:
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 中,但你明白了。
关于performance - 如何修复我的 numberOfDigits 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200539/
遇到一些代码,其中通过将数字转换为字符串然后使用 len() 来确定位数。 Function numOfDigits_len(n As Long) As Long numOfDigits_le
我是一名优秀的程序员,十分优秀!