gpt4 book ai didi

performance - 如何修复我的 numberOfDigits 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:42:59 25 4
gpt4 key购买 nike

遇到一些代码,其中通过将数字转换为字符串然后使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com