首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复我的numberOfDigits函数

问如何修复我的numberOfDigits函数
EN

Stack Overflow用户
提问于 2013-06-20 04:19:38
回答 3查看 103关注 0票数 6

遇到一些代码,其中数字的数量是通过将数字转换为字符串然后使用len()来确定的。

代码语言:javascript
复制
Function numOfDigits_len(n As Long) As Long
    numOfDigits_len = Len(Str(n)) - 1
End Function

现在,尽管这种方法可以工作,但我知道与任何不使用字符串的方法相比,它会很慢,所以我编写了一个使用log()的方法。

代码语言:javascript
复制
Function numOfDigits_log(n As Long) As Long
    numOfDigits_log = Int(Log(n) / Log(10)) + 1
End Function

将运行时间减少了1/2,这很棒,但在特定情况下发生了一些奇怪的事情。

代码语言:javascript
复制
  n     numOfDigits_log(n)
=====  ====================
 999            3
1000            3
1001            4

它将无法正确处理1000。我认为这是因为浮点数和舍入问题。

代码语言:javascript
复制
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()方法。我可以做类似这样的事情

代码语言:javascript
复制
Function numOfDigits_log(n As Long) As Long
    numOfDigits_log = Int(Log(n) / Log(10) + 0.000000001) + 1
End Function

但它看起来很“老土”。有没有比log()方法更快或更快的更好的方法?注意:我意识到这种优化在很多情况下是没有意义的,但现在我遇到了这个问题,我想“修复”它

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-20 04:56:17

我以前回答过这个问题,但我找不到它,所以这里是基本的:

代码语言:javascript
复制
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语言写的,但是你能理解其中的意思。

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 04:30:19

while循环保证正确性,即它不使用任何浮点计算

代码语言:javascript
复制
int numDigits = 0;
while(num != 0) {
    num /= 10;
    numDigits++;
}

你也可以通过使用更大的除数来提高速度。

代码语言:javascript
复制
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++;
}
票数 1
EN

Stack Overflow用户

发布于 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,你就赢了!

您可以进行此检测的方法类似于

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17200539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档